Python列表理解似乎不起作用

时间:2016-11-14 18:46:59

标签: python list list-comprehension

我正在尝试为for循环嵌套if代码块实现列表解析。但是,使用传统嵌套形式似乎工作的东西似乎在其列表理解表示中不起作用。从花费了相当长的时间后我能看到的是它遵循所需的逻辑。如果还有其他我正在跳过,请告诉我。

encoding = [x for x in data_list if x not in encoding]

使用列表理解

Params = 

[[ 0  1  2  3]

 [ 4  5  6  7]

 [ 8  9 10 11]]

谢谢。

4 个答案:

答案 0 :(得分:3)

您的问题在这里:

encoding = [x for x in data_list if x not in encoding]

您正在做的是重新分配编码到此列表理解[x for x in data_list if x not in encoding]

所以你所做的就是将编码设置为首先不包含在其中的元素。

你应该做的是: encoding.extend([x for x in data_list if x not in encoding])

通过这种方式,您可以使用列表推导的结果扩展列表

这是一些测试代码:

encoding = ['a','b','c','d']
encoding2 = ['a','b','c','d']

data_list = ['a','b','c','d','d','d','e','f','g']

print(encoding)
print(encoding2)

for x in data_list:
    if x not in encoding:
        encoding.append(x)

encoding2.extend([x for x in data_list if x not in encoding2])

print(encoding)
print(encoding2)

打印:

['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
['a', 'b', 'c', 'd', 'e', 'f', 'g']

现在,这不是一个完美的解决方案,因为如果它们在data_list多次出现,它仍会复制元素。这样做的原因是在for循环示例中,encoding在每次追加操作之后被检查,而列表推导仅基于encoding的初始状态进行操作。因此,如果他们在data_list不止一次,就会多次将元素推入其中。

如果您想解决此问题,请首先将列表推导转换为set,如下所示:

encoding.extend(set([x for x in data_list if x not in encoding]))

你有它!

答案 1 :(得分:1)

[x for x in data_list if x not in encoding]在“一次呼吸”时执行,因此它不会在运行时更新encoding,从而导致空encoding导致所有项目被选中。

使用list(set(data_list))执行您要实现的目标。这会将列表转换为set,导致重复丢失,然后将其转换回列表。

>>> a = [1, 2, 3, 2, 3]
>>> list(set(a))
[1, 2, 3]
>>> a = [1, 4, 2, 5, 'g', 'd', 'g', 2, 4]
>>> list(set(a))
[1, 2, 'd', 4, 5, 'g']

如果您已在encoding中拥有数据,则可以直接添加:

list(set([x for x in data_list if x not in encoding]))

答案 2 :(得分:1)

你的两个例子并不等同。如果您要将data_listencoding中尚未编码的元素(这是您的for循环示例所做的)附加,但使用list-comprehension,请执行以下操作:

encoding.extend(x for x in data_list if x not in encoding)

答案 3 :(得分:0)

列表推导中的2 encoding不是同一个变量。如果您必须有一个班轮,reduce更合适:

encoding = reduce(lambda l,x: x in l and l or l+[x], data_list, encoding)

虽然我觉得它不太可读。