我在stackoverflow上发现了这个,它确实是我想要的:
>>> k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4]]
>>> import itertools
>>> k.sort()
>>> list(k for k,_ in itertools.groupby(k))
[[1, 2], [3], [4], [5, 6, 2]]
我不明白这里的列表理解。如果无法将其转换为for iteration
。我总是使用以下语法:
[k for k in smthiterable (if condition)]
我尝试将下划线_
更改为其他内容,但仍然有效。但如果我删除它,它不会。它有什么用?
答案 0 :(得分:4)
itertools.groupby
会返回对项的可迭代内容;在每对中,首先是分组键,第二个是属于该组的项。构造for k,_ in iterable
解包这些对,它直接类比赋值语句k, _ = (0, 1)
如何将元组对象解包为两个名称。在这里使用_
作为变量名是无关紧要的(这是Python中常用的约定,表示该值未被使用)。
您提供的代码并不是groupby
的特别令人信服的用法,因为组对象被丢弃,只使用了唯一的密钥。
下面的列表理解更多是Pythonic,它避免了创建"无用的变量":
>>> [list(x) for x in sorted(set(map(tuple, k)))]
[[1, 2], [3], [4], [5, 6, 2]]
答案 1 :(得分:3)
下划线(_
)与任何其他变量非常相似,它不是特殊的语法。如果它让您感到困惑,请假装它是x
。下划线通常用于表示未使用的"变量。 itertools.groupby
返回一个iterable,其中每次迭代返回另一个iterable(后面这些迭代中的每一个碰巧总是有两个元素)。因此k, _
语法只是进行元组解包(请参阅此处:https://chrisalbon.com/python/unpacking_a_tuple.html)。
k
将是每个可迭代的第一个元素(第二个元素被分配给_
)。
这里是方便链接的精简示例(如果链接死亡):
soldiers = [('Steve', 'Miller'), ('Stacy', 'Markov'), ('Sonya', 'Matthews')]
for _, last_name in soldiers:
# print the second element
print(last_name)
输出:
Miller
Markov
Matthews