我有一个整数列表。
我想要做的是对它们进行排序并删除所有重复项。 我在网上看到了两种不同的解决方案。两者似乎都给出了与我期望的结果不同的结果。
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]
有人知道这种行为的原因吗?
谢谢!
答案 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
在您的代码中,以下行...
c = dict().fromkeys(sorted(a)).keys()
使用dict
的密钥创建a
,默认值为None
。然后,只需使用keys()
方法检索密钥。由于字典没有定义的顺序,因此随机检索元素。你需要求助他们。在任何情况下,您都应该使用已提出的sorted(set(a))
。
答案 3 :(得分:0)
keys
方法返回未定义(但调用之间一致)顺序的字典键,无论字典是如何创建的。 [编辑:正如评论中指出的那样,只要字典保持不变,顺序就是一致的。]
答案 4 :(得分:0)
字典不保证按插入顺序迭代(和打印)键。
使用collections.OrderedDict
。