当两个列表中都有重复元素时的列表理解

List comprehension when there are repeated elements in both lists

我想查找具有一组特定目标字母的所有单词。当目标中的字母 none 重复时,我的代码有效,但如果有重复则无效。

这是我的代码:

target = 'bba'
target_words = [
  'aani', 'aaru', 'abac', 'abas', 
  'abba', 'abby', 'abed', 'abel', 'abet'
]
target_list = list(target)


final_list = []
for word in target_words:
    word_list = list(word)
    if (all(x in word_list for x in target_list)):
        final_list.append(word)
        
print('Final list: ', final_list)

输出为Final list: ['abac', 'abas', 'abba', 'abby', 'abed', 'abel', 'abet']

我希望它是Final list: ['abba', 'abby']

我找不到获得我想要的结果的方法。可能是因为我正在将单词的字母转换成列表,但我不知道如何做。

这是 collections.Counter() 的一个很好的用例。它为我们提供了一种干净的方法来检查 target_wordstarget 中的单词之间是否存在所需的重叠,考虑重复字母(azro 提出的改进建议):

from collections import Counter

target_counter = Counter(target)
[word for word in target_words if Counter(word) & target_counter == target_counter]

这输出:

['abba', 'abby']

首先让我们找出目标词中的唯一字母。

target_word_letters = set(target)

现在,我们可以使用字典理解来计算每个字母的数量。

counts = {letter: target.count(letter) for letter in target_word_letters}

现在我们需要一个遍历 target_words 的列表理解,并检查 counts 中的每个字母,目标词中是否有相同数量(或更多)的字母。

[word for word in target_words if all(word.count(l) >= c for l, c in counts.items())]

结果:

['abba', 'abby']