nip*_*dha 8 python tuples list python-3.x
我正在寻找一种有效的方法来组合一个数字范围,就像(20,24)另一个对象一样{'a': 'b'},
[(20, {'a': 'b'}), (21, {'a': 'b'}), (22, {'a': 'b'}), (23, {'a': 'b'})]
Run Code Online (Sandbox Code Playgroud)
如果我有一个数字列表[20, 21, 22, 23],我知道迭代列表是要走的路.但在这里我有一系列数字.所以可能有一种方法可以更优雅地将元组中的范围元素包装起来.
以下是我尝试实现此目的:
min = 20
max = 23
data = {"a": "b"}
result = []
for i in range(min, max + 1):
result.append((i, data))
print(result)
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有更好的方法来做到这一点.
cs9*_*s95 10
实际上,任何附加到空列表的for循环都可以转换为列表理解.
l = []
for x in range(20, 24):
l.append((x, data))
Run Code Online (Sandbox Code Playgroud)
要么,
l = [(x, data) for x in range(20, 24)]
Run Code Online (Sandbox Code Playgroud)
但是!请注意,你得到的是这个 -
for i in l:
print(id(i[1]))
4835204232
4835204232
4835204232
4835204232
Run Code Online (Sandbox Code Playgroud)
同一对象被多次引用复制的位置.这是可变对象的问题,因为如果更改了一个对象,它们都会反映出这种变化.因此,我建议您在每一步制作一份数据副本.您可以使用内置dict.copy函数,也可以使用copy模块中的函数.在前一种情况下,只完成浅拷贝,所以如果你有一个嵌套结构,那不是一个好主意.
无论如何,我就是这样做的 -
import copy
l = [(x, copy.deepcopy(data)) for x in range(20, 24)]
Run Code Online (Sandbox Code Playgroud)
如果你的字典结构不复杂(例如 - {'a' : {'b' : 'c'}}),dict.copy我上面提到的方法有效 -
l = [(x, data.copy()) for x in range(20, 24)]
Run Code Online (Sandbox Code Playgroud)
一个有趣的方式是使用zip即
mini = 20
maxi = 24
data = {'a':'b'}
l = range(mini,maxi)
list(zip(l,[data]*len(l)))
[(20, {'a': 'b'}), (21, {'a': 'b'}), (22, {'a': 'b'}), (23, {'a': 'b'})]
Run Code Online (Sandbox Code Playgroud)