我有两个列表如下所示:
sq = [['welcome'], ['we', 'are'], ['the', 'champions']]
sl = [['we', 'are', 'rainbow', 'while', 'to', 'and', 'do', 'welcome', 'while', 'cant', 'did'], ['are', 'time', 'to', 'do', 'the', 'champions', 'while', 'am']]
我需要创建一个for循环,它将从sl的子列表中查看sq中包含多少个元素。如果sq中的一个单词包含在sl中,它将添加1作为匹配,如果不是,则添加0。
以上列表中的示例为例,我们从sl获取第一个子列表,即:
['we', 'are', 'rainbow', 'while', 'to', 'and', 'do', 'welcome', 'while', 'cant', 'did']
并将其与qs列表进行比较,以查看子列表中是否包含qs中的任何内容。结果应该是这样的列表:
[1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0]
第一个子列表中有11个单词,这就是我希望匹配在列表中显示的方式。我需要为sl中的每个子列表执行此操作。 Beneath是我当前的代码,它已经过时了。
testList = []
testlistnew =[]
for k in sl:
if k not in testlistnew:
testlistnew[k] = 0
if k in sq:
testList[k] = 1
else:
testList[k] = 0
仅供参考,这应该是整个比较sq与sl:
的输出matches = [[1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0], [1, 0, 0, 0, 1, 1, 0, 0]]
答案 0 :(得分:2)
这是实现此目的的一种方法。 sum
只是在这里展平你的嵌套列表。
sq = [['welcome'], ['we', 'are'], ['the', 'champions']]
sl = [['we', 'are', 'rainbow', 'while', 'to', 'and', 'do', 'welcome', 'while', 'cant', 'did'], ['are', 'time', 'to', 'do', 'the', 'champions', 'while', 'am']]
_flat = sum(sq, [])
test = []
for i, nested_list in enumerate(sl):
test.append([])
for item in nested_list:
test[i].append(1 if item in _flat else 0)
print(test)
Forloop可能更有助于理解,但这可以使用列表理解更简洁地完成。或者,请参阅评论。
sq = [['welcome'], ['we', 'are'], ['the', 'champions']]
sl = [['we', 'are', 'rainbow', 'while', 'to', 'and', 'do', 'welcome', 'while', 'cant', 'did'], ['are', 'time', 'to', 'do', 'the', 'champions', 'while', 'am']]
_flat = sum(sq, [])
test = [[1 if item in _flat else 0 for item in nl] for nl in sl]
答案 1 :(得分:1)
另一种选择。
注意:
我更喜欢将列表推导用于循环。
我将所有数据都放在set
中以加快查询速度。
from pprint import pprint
# Test data
sq = [['welcome'], ['we', 'are'], ['the', 'champions']]
sl = [['we', 'are', 'rainbow', 'while', 'to', 'and', 'do', 'welcome', 'while', 'cant', 'did'], ['are', 'time', 'to', 'do', 'the', 'champions', 'while', 'am']]
# Create result
sq_set = set(sq_str for sq_item in sq for sq_str in sq_item)
result = [
[
int(sl_str in sq_set)
for sl_str in sl_item
]
for sl_item in sl
]
# Display result
pprint (result)