Python列表理解似乎不起作用
我正在尝试实现一个for循环嵌套if代码块的列表理解。然而,使用传统嵌套形式似乎有效的内容在其列表理解表示中似乎不起作用。在花了相当长的时间后,我可以看到它遵循了所需的逻辑。请让我知道,如果还有什么我跳过Python列表理解似乎不起作用,python,list,list-comprehension,Python,List,List Comprehension,我正在尝试实现一个for循环嵌套if代码块的列表理解。然而,使用传统嵌套形式似乎有效的内容在其列表理解表示中似乎不起作用。在花了相当长的时间后,我可以看到它遵循了所需的逻辑。请让我知道,如果还有什么我跳过 for x in data_list: if x not in encoding: encoding.append(x) 使用列表理解 encoding = [x for x in data_list if x not in encoding] 谢谢。[x代表数据列
for x in data_list:
if x not in encoding:
encoding.append(x)
使用列表理解
encoding = [x for x in data_list if x not in encoding]
谢谢。
[x代表数据列表中的x,如果x不在编码中]
在“一次呼吸”时执行,因此它不会在运行时更新编码,导致空编码
,从而导致选择每个项目
使用list(set(data_list))
完成您试图实现的目标。这会将列表转换为set,导致重复项丢失,然后将其转换回list
>>> 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']
如果您已经有了编码中的数据
,您可以简单地添加它:
list(set([x for x in data_list if x not in encoding]))
你的两个例子并不相同。如果要将数据列表
中的元素附加到编码
中,但这些元素尚未在编码中(这是for循环示例所做的),但使用列表理解,请执行以下操作:
encoding.extend(x for x in data_list if x not in encoding)
你的问题在这里:
encoding = [x for x in data_list if x not in encoding]
您所做的是将编码重新分配到此列表[x代表数据列表中的x\u如果x不在编码中]
因此,您要做的是将编码设置为仅包含最初不在其中的元素
你应该做的是:
encoding.extend([x代表数据列表中的x,如果x不在编码中])
通过这种方式,您可以使用列表理解的结果扩展列表
下面是一些测试代码:
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\u列表中
多次,它仍然会复制元素。这是因为在例如for循环中,每次追加操作后都会检查编码
,而列表理解仅基于编码
的初始状态进行操作。因此,如果元素多次出现在data\u列表中,它将不止一次地将元素推入其中
如果您想绕过此问题,请先将列表理解转换为集合
,如下所示:
encoding.extend(设置([x代表数据列表中的x,如果x不在编码中])
给你 列表中的2编码
不是同一个变量。如果必须使用单行程序,reduce
更合适:
encoding = reduce(lambda l,x: x in l and l or l+[x], data_list, encoding)
虽然我不认为它可读性很强。我很确定这不是我们要问的问题@codeahead希望将数据列表
中尚未在编码
中的任何值添加到编码
。您的解决方案只是从数据列表中删除重复项
,但完全忽略编码
。其次,转换到集合是有用的,但不是最终需要的。我假设他使用编码
删除重复项,并且当您向编码
添加值时,下一次出现的情况将被忽略。在许多情况下删除重复项的常见做法是:编码=['a','a','b','c']
。使用您的解决方案,您将丢失编码中重复的'a'
s。同意@bunji,这不是对OPs问题的回答。