我有两个清单:
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])
但是我的"字符串索引超出了范围错误"
答案 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
,以解决此问题。