删除列表中的重复项时出现奇怪的行为

时间:2012-02-07 15:26:58

标签: python list duplicates

我有一个整数列表。

我想要做的是对它们进行排序并删除所有重复项。 我在网上看到了两种不同的解决方案。两者似乎都给出了与我期望的结果不同的结果。

a = integer_combinations(5, 5)
print a
>>[4, 8, 16, 32, 9, 27, 81, 243, 16, 64, 256, 1024, 25, 125, 625, 3125]

b = sorted(a)
print b
>>[4, 8, 9, 16, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125]

c = dict().fromkeys(sorted(a)).keys()
print c
>> [32, 64, 4, 1024, 625, 8, 9, 256, 16, 81, 243, 3125, 25, 27, 125]

另一种方法,使用集合:

d = list(set(b))
print d
>> [32, 64, 4, 1024, 625, 8, 9, 256, 16, 81, 243, 3125, 25, 27, 125]   

What I expect is :
>>[4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125]

有人知道这种行为的原因吗?

谢谢!

5 个答案:

答案 0 :(得分:8)

以下是我要使用的内容:

>>> a = [4, 8, 16, 32, 9, 27, 81, 243, 16, 64, 256, 1024, 25, 125, 625, 3125]
>>> sorted(set(a))
[4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125]

您的代码无法按预期工作的原因是dict不保证其密钥的任何特定顺序。同样,set无法保证其元素的排序。

因此,排序步骤必须在最后完成。

答案 1 :(得分:3)

set()是一个无序集合。像字典一样,它会故意置换密钥以便快速访问。因此:list(set(...))返回未排序项的列表。改为使用:

sorted(set(...))

如果您需要有序序列。

答案 2 :(得分:2)

Python set在2.3版中引入。如果你使用Python> = 2.3

,@ aix提出的解决方案是大多数Pythonic

在您的代码中,以下行...

c = dict().fromkeys(sorted(a)).keys()

使用dict的密钥创建a,默认值为None。然后,只需使用keys()方法检索密钥。由于字典没有定义的顺序,因此随机检索元素。你需要求助他们。在任何情况下,您都应该使用已提出的sorted(set(a))

答案 3 :(得分:0)

keys方法返回未定义(但调用之间一致)顺序的字典键,无论字典是如何创建的。 [编辑:正如评论中指出的那样,只要字典保持不变,顺序就是一致的。]

答案 4 :(得分:0)

字典不保证按插入顺序迭代(和打印)键。

使用collections.OrderedDict