代码之家  ›  专栏  ›  技术社区  ›  pyeR_biz

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

  •  0
  • pyeR_biz  · 技术社区  · 8 年前

    给定一个单词和一个单词列表,我必须找到可以使用给定单词的字母(字母计数)构建的列表元素/单词。我试着用 Counter 集合中的对象和Python2.7的定义 cmp() 函数(我使用的是3.6.5)。

    从那时起,我开始意识到这种方法对于这样一个问题来说似乎是不好的实践(之前,我试图使用计数器对象字典进行比较)。我的程序不起作用的原因是比较依赖于列表之间的“>”、“<”操作,这些操作根据词典顺序给出结果。( referred from here )所以即使“raven”可以由“ravenous”生成,下面的程序也会因为排序列表中字符的顺序而失败。

    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) 在里面 列表字 反对 (a),1) 在里面 list_candidates[i] 也可能是 ('a',5) 在里面 列表字 反对 (a),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 回复  |  直到 8 年前
        1
  •  2
  •   Gelineau    8 年前

    我认为使用计数器是个不错的选择。不要把它们变成单子。 我故意返回[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)