比较元组列表,根据条件确认子集?

时间:2018-06-05 06:13:00

标签: python string python-3.x counter

给定一个单词和一个单词列表,我必须找到可以使用给定单词的字母(字母数量)构建的列表元素/单词。我试图使用集合中的Counter对象和python 2.7' cmp()函数的定义(我使用3.6.5)。

我已经意识到这种方法对于这样的问题似乎是不好的做法(早些时候,我试图使用反对象 - 字典进行比较)。我的程序无法运行的原因是因为compare_fn依赖于'>''<'列表之间的操作,根据字典顺序给出结果(modelr)。所以即使“乌鸦”也是如此。可以从“贪婪”中制作,由于排序列表中的字符顺序,下面的程序将失败。

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]

因此,对于以下两个列表,我如何确认list_candidates[0]list_word的子集。请注意('a',1)list_word('a',1)的{​​{1}} list_candidates[i]('a',5) list_word('a',1) list_candidates[i]的{​​{1}} {1}};两种情况都属实。

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)]

1 个答案:

答案 0 :(得分:2)

我认为使用计数器是一个不错的选择。别把它们变成名单。 我故意返回[True,False,False]而不是[1,-1,-1],但你可以很容易地改变它。

此外:我使用了列表理解而不是map,因为它在python中更新,但语义是相同的。

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)