列表理解无用的变量

时间:2017-05-16 15:52:00

标签: python list-comprehension

我在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)]   

我尝试将下划线_更改为其他内容,但仍然有效。但如果我删除它,它不会。它有什么用?

2 个答案:

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