如何让Python分享相等的整数

时间:2011-12-16 16:31:58

标签: python list dictionary indexing equals

区分相同的整数有一点问题。

在下面(显然是一个小事)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[:]

那么,有没有什么方法可以用我相同的整数来做这个?

(我尝试将其中一个浮动,但值保持不变,因此不起作用。)

5 个答案:

答案 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)]

可能有帮助,但我不确定你在这之后的实际情况。