列表与列表列表的第一个元素之间的交集

时间:2013-12-15 17:33:22

标签: python list intersection enumerate

我有两个清单:

wordlist =  ['A', 'Aani', 'Aaron', 'Aaronic',
             'Aaronical', 'Aaronite', 'Aaronitic',
             'Aaru', 'Ab', 'Ababdeh']

wordlist_compound = [['A','0'], ['Aaronic','1'], ['Key','2'],
                     ['Aaronical','3'], ['Aaronite','4'], ['Yes','5']]

我想取两个单词的交集,并在第三个列表中创建一个包含单词,数字组合编号的列表wordlist_final,以便wordlist_final看起来像:

[['A','0'], ['Aaronic','1'], ['Aaronical','3'], ['Aaronite','4']]

我目前的代码如下:

wordlist_final = []
for index, word in enumerate(wordlist):
    for word_comp in wordlist_compound:
        if word[index] == wordlist_compound[index][0]:
            wordlist_final.append(wordlist_compound[index])

但是我的"字符串索引超出了范围错误"

4 个答案:

答案 0 :(得分:5)

使用列表解析可以轻松完成输出:

wl=['A', 'Aani', 'Aaron', 'Aaronic', 'Aaronical', 'Aaronite', 'Aaronitic', 'Aaru', 'Ab', 'Ababdeh']
wlc=[['A','0'], ['Aaronic','1'], ['Key','2'], ['Aaronical','3'], ['Aaronite','4'], ['Yes','5']]

print [[word, i] for word,i in wlc if word in wl]    
# [['A', '0'], ['Aaronic', '1'], ['Aaronical', '3'], ['Aaronite', '4']]

替代LC:

print [li for li in wlc if li[0] in wl]   

如果你想要一个循环结构:

wlf = []
for word, i in wlc:
    if word in wl:
        wlf.append([word,i])

print wlf       
# [['A', '0'], ['Aaronic', '1'], ['Aaronical', '3'], ['Aaronite', '4']]

Python序列通常不需要枚举来处理序列中的对象。如果除了序列本身之外还有关于索引或订单的“数据”,通常只需要使用enumerate

在这里,您将使用wordlist_compound中的每个元素并测试wordlist中单词的成员身份。无需枚举。如果颠倒循环,也可以大大简化任务;循环遍历wordlist_compound,而不是在外循环中循环wordlist。您的输出是wordlist_compound中元素的过滤器;当然,这意味着您也可以使用filter

print filter(lambda li: li[0] in wl, wlc)
# [['A', '0'], ['Aaronic', '1'], ['Aaronical', '3'], ['Aaronite', '4']]

干杯。

答案 1 :(得分:0)

if word[index] == wordlist_compound[index][0]:

我认为必须

if word == wordlist_compound[index][0]:

您在元素'Aaru'上获得此异常:其索引为7'Aaru'[7]不存在。

但是这个观察对你没有帮助,因为你的循环包含一些逻辑错误。我会像这样重写它:

for inner_list in wordlist_compound: 
    if inner_list[0] in wordlist: 
        wordlist_final.append(inner_list) 

或使用列表理解,dawg have shown

答案 2 :(得分:0)

问题在于len(wordlist) > len(wordlist_compound),因此使用index wordlist索引wordlist_compound会使索引超出绑定错误。

另外,正如@aga所提到的,应该是if word == wordlist_compound[index][0]

答案 3 :(得分:0)

根据两个集合的大小,我可能会这样做:

word_numbers = dict(wordlist_compound)
wordlist_final = [(word, word_numbers[word]) for word in wordlist if word in word_numbers]

如果您不关心结果的顺序(或者如果两个列表的顺序相同,在这种情况下按字母顺序排列),那么您可以改为:

words = set(wordlist)
wordlist_final = [p for p in wordlist_compound if p[0] in words]

如果wordlist_compound可能明显大于wordlist,那将是更好的选择。

我刚注意到,在这两种情况下,我都返回了一个元组列表,而你有一个列表列表。如有必要,您可以在第一段代码中将()更改为[],或在第二段中将p for p更改为list(p) for p,以解决此问题。