取两个列表并比较相似之处

时间:2016-04-11 23:23:57

标签: python list

我有两个列表如下所示:

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]]

2 个答案:

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