当两个列表中都有重复元素时的列表理解
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_words
和 target
中的单词之间是否存在所需的重叠,考虑重复字母(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']
我想查找具有一组特定目标字母的所有单词。当目标中的字母 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_words
和 target
中的单词之间是否存在所需的重叠,考虑重复字母(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']