Compare list of tuples, confirm subset based on condition?
给定一个单词和一个单词列表,我必须找到可以使用给定单词的字母(字母数问题)构建的列表元素/单词。我尝试使用集合中的
从那时起,我开始意识到这种方法对于这样一个问题似乎是不好的实践(之前,我尝试使用反对象字典进行比较)。我的程序不起作用的原因是,比较"fn"依赖于列表之间的">"、"<"操作,这些操作基于词典编纂顺序(此处引用)给出结果。因此,即使"raven"可以从"ravenous"中生成,下面的程序也会因排序列表中的char顺序而失败。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from collections import Counter word = 'ravenous' candidates = ["raven","mealwheel","rasputin"] def count_fn(mystr): return sorted(list(Counter(mystr).items())) def compare_fn (c1,c2): return ((c1>c2) - (c1<c2)) list_word = count_fn(word) list_candidates = list(map(count_fn,candidates)) cmp_list = [compare_fn(list_word,i) for i in list_candidates] cmp_list #[-1, -1, -1] #should be [1,-1,-1] |
因此,对于下面的两个列表,我如何确认
1 2 3 4 | print(list_word) #[('a', 1), ('e', 1), ('n', 1), ('o', 1), ('r', 1), ('s', 1), ('u', 1), ('v', 1)] print(list_candidates[0]) #[('a', 1), ('e', 1), ('n', 1), ('r', 1), ('v', 1)] |
号
我认为使用计数器是个不错的选择。不要把它们变成列表。我故意返回[true,false,false]而不是[1,-1,-1],但是您可以很容易地更改它。
此外:我使用了列表理解而不是映射,因为它在Python中更为流行,但是语义是相同的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from collections import Counter word = 'ravenous' candidates = ["raven","mealwheel","rasputin"] def count_fn(mystr): return Counter(mystr) def compare_fn (c1,c2): return all(c1[char] >= count for char, count in c2.items()) counter_word = count_fn(word) list_candidates = [count_fn(candidate) for candidate in candidates] cmp_list = [compare_fn(counter_word, i) for i in list_candidates] print(cmp_list) |