有没有一种使用范围创建元组列表的有效方法?

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)


Flo*_*oor 6

一个有趣的方式是使用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)