Python 列表和列表列表的第一个元素之间的交集
我有两份清单:Python 列表和列表列表的第一个元素之间的交集,python,list,intersection,enumerate,Python,List,Intersection,Enumerate,我有两份清单: wordlist = ['A', 'Aani', 'Aaron', 'Aaronic', 'Aaronical', 'Aaronite', 'Aaronitic', 'Aaru', 'Ab', 'Ababdeh'] 及 我想取这两个单词的交叉点,制作一个列表,其中包含第三个列表中的单词、数字组合数字wordlist_final,这样wordlist_final看起来像: [['A','0'], ['Aaronic','1']
wordlist = ['A', 'Aani', 'Aaron', 'Aaronic',
'Aaronical', 'Aaronite', 'Aaronitic',
'Aaru', 'Ab', 'Ababdeh']
及
我想取这两个单词的交叉点,制作一个列表,其中包含第三个列表中的单词、数字组合数字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])
我当前的代码如下所示:
[['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])
但我得到一个“字符串索引超出范围错误”
我相信这是必须的
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)
或者使用列表理解,例如。使用列表理解可以轻松完成输出:
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']]
备选信用证:
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序列通常不需要枚举来处理序列中的对象。如果索引或顺序中除了序列本身之外还有“数据”,则通常只需要使用枚举
在这里,您将获取wordlist\u composite
中的每个元素,并测试wordlist
中单词的成员资格。不需要枚举。如果您反转循环,您也可以大大简化任务;循环使用wordlist\u composite
,而不是在外部循环中循环使用wordlist
。您的输出是wordlist_component
中元素的过滤器;当然,这意味着您也可以使用filter
:
print filter(lambda li: li[0] in wl, wlc)
# [['A', '0'], ['Aaronic', '1'], ['Aaronical', '3'], ['Aaronite', '4']]
干杯。问题是
len(wordlist)>len(wordlist\u component)
,因此使用wordlist
的索引wordlist\u component
将给出索引越界错误
另外,正如@aga所提到的,如果word==wordlist\u component[index][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\u component
可能比wordlist
大得多,那么这将是更好的选择
我刚刚注意到,在这两种情况下,我都返回了一个元组列表,而您有一个列表列表。如果有必要,您可以通过在我的第一个代码块中将
()
更改为[]
,或者在第二个代码块中将p更改为list(p)for p
。当enumerate
到达7,'Aaru'
并尝试计算word[index]
时,您将得到“字符串索引超出范围”。无论您认为索引
代表什么,请再次查看。此外,您的代码在单词列表中为单词comp(复合词)
显示,但从不在列表中使用word(复合词)
。这应该是一个非常有力的指标,告诉你你的代码是错误的。非常优雅!非常感谢你。