列表和列表中第一个元素的交集

3

我有两个列表:

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:
```html

wordlist_final = [(word1, number1), (word2, number2), ...]

```
[['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])

但是我遇到了“字符串索引超出范围”的错误。

2
enumerate7,'Aaru'并且您尝试计算word[index]时,会出现“字符串索引超出范围”的错误。无论您认为index代表什么,请再次查看。此外,您的代码中写着for word_comp in wordlist_compound,但从未在列表中使用word_comp。这应该是您的代码有误的一个很强的指示。 - Steve Jessop
4个回答

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

欢呼。

非常优雅!非常感谢。 - user1205371

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所示的那样。


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来修复它。


0
问题在于len(wordlist) > len(wordlist_compound),因此使用wordlistindex来索引wordlist_compound将导致索引越界错误。
另外,正如@aga所提到的,应该是if word == wordlist_compound[index][0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接