集合理解与嵌套循环

问题描述

我有一个字符串列表,每个字符串都有一个或多个单词。我需要从这个列表中列出一个独特的词。我可以使用两个嵌套循环轻松完成,但我不明白为什么使用集合推导式无法获得相同的结果。

嵌套循环:

import re

items = ['17th C White','Accra White','Acid White']

word_list = set()
for item in items:
    for word in re.split("\s|[-'/]",item):
        word_list.add(word)
print(word_list)

嵌套循环的结果(正确):

{'White','Acid','Accra','17th','C'}

集合理解:

import re

items = ['17th C White','Acid White']

word_list = {word for word in re.split("\s|[-'/]",item) for item in items}
print(word_list)

集合推导的结果(错误):

{'White','Acid'}

为什么我没有从集合推导中得到相同的结果?

解决方法

你的套路理解不太对。

你有:

{word for word in re.split("\s|[-'/]",item) for item in items}

你的意思是:

{word for item in items for word in re.split("\s|[-'/]",item)}

第一个版本在表达式 item 中使用 "Acid White" 的先前值,该值必须为 for word in re.split("\s|[-'/]",item)

如果您在一个推导式中有多个 for 部分,您应该将定义变量的部分 (item) 放在使用变量的部分 (re.split("\s|[-'/]",item)) 之前。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...