【问题标题】:How to get Python to tell equal integers apart如何让 Python 区分相等的整数
【发布时间】:2011-12-16 16:31:57
【问题描述】:

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

在下面(这显然是一个微不足道的情况)中,a、b、c 是整数。我希望创建一个字典,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_0 如果它们相同,则表示它们无法区分。
  • 那么,让我们说a == 1 and b == 1diction[1] 应该提供什么?
  • 也许您想按字符串“a”、“b”和“c”而不是它们的值来索引?

标签: python list dictionary indexing equals


【解决方案1】:

要从两个不同的可迭代对象创建字典,可以使用以下代码:

d = dict(zip((a, b, c), ('foo', 'bar', 'baz')))

其中zip 用于将两个可迭代对象组合成一个元组列表,可以传递给字典构造函数。

请注意,如果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)

【讨论】:

    【解决方案2】:

    你无法区分相同的对象。

    【讨论】:

    • 它们不一定相同。试试 a = 1000 \ b = 1000 \ a 是 b。
    • @soulcheck:OP 使用“相同”来表示“相等”,并且需要注意的是,BenH 的答案是正确的。
    • @EthanFurman 是的,我错过了最后一句话。也许OP会发现答案和我的评论都很有用。
    【解决方案3】:

    如果它们不在 -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】:

      如果 a 和 b 具有相同的值,那么如果用作键,则不能指望它们指向字典中的不同位置。字典中的键值必须是唯一的。

      另外,如果你有两个序列,用它们制作字典的最简单方法是将它们压缩在一起:

      tup = (a,b,c)
      val = ('foo', 'bar', 'baz')
      diction = dict(zip(tup, val))
      

      【讨论】:

        【解决方案5】:

        到目前为止,所有答案都是正确的 - 相同的键不能在字典中重复使用。如果您绝对必须尝试执行类似操作,但无法确保 a、b 和 c 具有不同的值,您可以尝试执行以下操作:

        d = dict(zip((id(k) for k in (a,b,c)), ('foo', 'bar', 'baz')))
        

        不过,当你去查找你的价值观时,你必须记得这样做:

        d[id(a)]
        

        可能有帮助,但我不确定你到底想要什么。

        【讨论】:

          猜你喜欢
          • 2012-09-08
          • 2015-10-05
          • 2013-10-26
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          • 2012-05-01
          • 2023-04-09
          • 1970-01-01
          相关资源
          最近更新 更多