区分相同的整数有一点问题。
在下面(显然是一个小事)a,b,c是整数。我希望创建一个dicionary,diction,其中包含{a:'foo',b:'bar',c:'baz'}
diction = {}
for i in (a, b, c):
j = ('foo', 'bar', 'baz')[(a, b, c).index(i)]
diction[i] = j
所有运行都非常好,直到例如a和b相同:第三行将为a和b提供索引0,导致每种情况的j ='foo'。
我知道列表可以通过
复制list_a = [1, 2, 3]
list_b = list(list_a)
或
list_b = list_a[:]
那么,有没有什么方法可以用我相同的整数来做这个?
(我尝试将其中一个浮动,但值保持不变,因此不起作用。)
答案 0 :(得分:3)
要从两个不同的iterables创建字典,您可以使用以下代码:
d = dict(zip((a, b, c), ('foo', 'bar', 'baz')))
其中zip
用于组合可以传递给字典构造函数的元组列表中的两个iterables。
请注意,如果a==b
,那么'foo'
将被'bar'
覆盖,因为这些值会按照它们在迭代中的相同顺序添加到字典中,就像您在使用此代码:
d[a] = 'foo'
d[b] = 'bar'
d[c] = 'baz'
这只是字典的标准行为,当为已知的键指定新值时,该值将被覆盖。
如果您希望将所有值保留在列表中,则可以使用collections.defaultdict
,如下所示:
from collections import defaultdict
d = defaultdict(list)
for key, value in zip((a, b, c), ('foo', 'bar', 'baz')):
d[key].append(value)
答案 1 :(得分:2)
您无法区分相同的对象。
答案 2 :(得分:1)
如果a和b具有相同的值,那么如果用作键,则不能指望它们指向字典中的不同位置。字典中的键值必须是唯一的。
另外,如果你有两个序列,最简单的方法就是将它们拼接在一起:
tup = (a,b,c)
val = ('foo', 'bar', 'baz')
diction = dict(zip(tup, val))
答案 3 :(得分:1)
如果它们不介于-5到256之间,你可以区分它们
另见"is" operator behaves unexpectedly with integers
http://docs.python.org/c-api/int.html
当前实现为所有实体保留了一个整数对象数组 -5到256之间的整数,当你在该范围内创建一个int时 实际上只是返回对现有对象的引用。所以 应该可以改变1的值。我怀疑这种行为 在这种情况下,Python是未定义的。 : - )
In [30]: a = 257
In [31]: a is 257
Out[31]: False
In [32]: a = 256
In [33]: a is 256
Out[33]: True
你可能不得不像实现这种行为的对象一样滚动你自己的字典......而且它仍然无法在-5到256之间做任何事情。我需要做更多的挖掘工作当然可以。
答案 4 :(得分:0)
到目前为止,所有答案都是正确的 - 相同的密钥不能在字典中重复使用。如果您绝对必须尝试执行此类操作,但无法确保a,b和c具有不同的值,您可以尝试这样的事情:
d = dict(zip((id(k) for k in (a,b,c)), ('foo', 'bar', 'baz')))
当你去查看你的价值观时,你必须记住这样做:
d[id(a)]
可能有帮助,但我不确定你在这之后的实际情况。