【问题标题】:Find matching values and their frequencies from multiple list of lists从多个列表中查找匹配值及其频率
【发布时间】:2020-08-02 12:50:06
【问题描述】:

我是 python 新手。假设我有多个列表列表(在本例中为 2 )。示例:

名单A [ ['a', 'b', 'a', 'c', 'd'] , ['q', 'w', 'a', 'c'] ]

列表 B [ ['a', 'p', 'z', 'c', 'q'] , ['a', 'l', 'k', 'j'] ].

我想比较列表 A 和列表 B,并找出两个列表中出现的特定元素及其频率。在这种情况下,我希望答案是“q”、“a”和“c”。但我不想计算列表 A 或列表 A 的任何子列表中出现的“a”。

考虑到列表 A 中的元素“a”,我只想知道列表 B 中是否也看到了“a”,并将该出现次数计为频率 = 2,但说“b”仅在列表 A 中看到,所以它的频率仅为1。我还想知道在其中看到元素的列表的名称,所以对于“a”,答案将是列表 A 和列表 B,但对于“b”,它只是列表 A。

基本直觉是跟踪与其他值相比分布更广(即存在于更多列表中)的值。有没有一种有效的方法来做到这一点?任何帮助表示赞赏,谢谢!

【问题讨论】:

  • 您能否更清楚地解释您的问题?我没有看到列表中的差异和字符频率之间的联系
  • 既然答案应该是 'q'、'a' 和 'c',你所说的更多传播是什么意思?虽然 'a' 出现在所有子列表中,但 'q' 在列表 A 和列表 B 中只出现一次。
  • @Danny 除了上面提到的,考虑到列表 A 中的元素 'a',我只想知道在列表 B 中是否也看到了 'a',并将出现次数计为频率 = 2,但是说'b'只出现在列表A中,所以它的频率只有1。我还想知道在其中看到元素的列表的名称,因此对于“a”,答案将是列表 A 和列表 B,但对于“b”,它只是列表 A。
  • @DarrylG 我的意思是更多的传播,哪些值出现在更多的列表中(在这种情况下是列表 A 和列表 B)。我有更多的列表列表,为了简单起见,在这里声明了 2。谢谢!
  • 那么您是否正在寻找出现在所有列表中的元素?项目“a”、“c”、“q”的计数为 2(即它们出现在两个列表中)。使用 n 个列表 List1、List2、... Listn,您是否正在寻找出现在所有 n 个列表中的元素(所以有 n 个计数)?

标签: python python-3.x list


【解决方案1】:

以下报告统计列表中项目的出现次数

def flatten(lst):
    " Flattens into single lists "
    return [val for sublist in lst for val in sublist]

def occurences(*lsts):
    " Takes in an arbitrary number of lists and reports frequencies of items "
    result = {}
    for i, lst in enumerate(lsts):
        f_lst = flatten(lst)
        for c in f_lst:
            result.setdefault(c, set()).add(i)
    # Add frequencies
    # key frequency is the count
    # key occurs is which numbered list of the item
    final = {}
    for c, s in result.items():
        final[c] = {'frequency': len(s), 'occurs':list(s)}
    return final

用法

stats = occurrences(List1, List2, ..., ListN)

测试

测试 1(ListA & ListB 是引用为 0, 1 in 发生)

ListA = [ ['a', 'b', 'a', 'c', 'd'] , ['q', 'w', 'a', 'c'] ]
ListB = [ ['a', 'p', 'z', 'c', 'q'] , ['a', 'l', 'k', 'j'] ]
from pprint import pprint as pp
pp(occurences(ListA, ListB))
{'a': {'frequency': 2, 'occurs': [0, 1]},
 'b': {'frequency': 1, 'occurs': [0]},
 'c': {'frequency': 2, 'occurs': [0, 1]},
 'd': {'frequency': 1, 'occurs': [0]},
 'j': {'frequency': 1, 'occurs': [1]},
 'k': {'frequency': 1, 'occurs': [1]},
 'l': {'frequency': 1, 'occurs': [1]},
 'p': {'frequency': 1, 'occurs': [1]},
 'q': {'frequency': 2, 'occurs': [0, 1]},
 'w': {'frequency': 1, 'occurs': [0]},
 'z': {'frequency': 1, 'occurs': [1]}}

测试 2(ListA、ListB、ListC 引用为 0、1、2 in 发生)

ListA = [ ['a', 'b', 'a', 'c', 'd'] , ['q', 'w', 'a', 'c'] ]
ListB = [ ['a', 'p', 'z', 'c', 'q'] , ['a', 'l', 'k', 'j'] ]
ListC = [ ['m', 'p', 'r', 's', 'q'] , ['a', 't', 'k', 'j'] ]
from pprint import pprint as pp
pp(occurences(ListA, ListB, ListC))

{'a': {'frequency': 3, 'occurs': [0, 1, 2]},
 'b': {'frequency': 1, 'occurs': [0]},
 'c': {'frequency': 2, 'occurs': [0, 1]},
 'd': {'frequency': 1, 'occurs': [0]},
 'j': {'frequency': 2, 'occurs': [1, 2]},
 'k': {'frequency': 2, 'occurs': [1, 2]},
 'l': {'frequency': 1, 'occurs': [1]},
 'm': {'frequency': 1, 'occurs': [2]},
 'p': {'frequency': 2, 'occurs': [1, 2]},
 'q': {'frequency': 3, 'occurs': [0, 1, 2]},
 'r': {'frequency': 1, 'occurs': [2]},
 's': {'frequency': 1, 'occurs': [2]},
 't': {'frequency': 1, 'occurs': [2]},
 'w': {'frequency': 1, 'occurs': [0]},
 'z': {'frequency': 1, 'occurs': [1]}}

【讨论】:

  • 谢谢!这对我有用。有没有办法在pp(occurences(ListA, ListB, ListC)) 中轻松添加列表,因为我有超过 100 个列表?
  • @列表 ListA、ListB、ListC 等是更大列表的子列表,即..my_big_list = [List1, List2, List3, ...List100]?如果是这样,结果 = 出现次数(*my_big_list)`。或者您的列表还有其他组织吗?
  • 我的列表存储在字典中:模式是 dict = { string : (list of lists) },其中列表列表是 list 1 ... N
  • 在这种情况下,将def occurences(*lsts): 更改为def occurences(lsts):for i, lst in enumerate(lsts): 更改为for i, lst in lsts.items(): 并使用字典作为occurences 的单个参数调用它可能更有意义跨度>
  • @SaranyaGupta--使用d = { string : (list of lists) },您将拥有result = occurences(*d[string])
猜你喜欢
  • 1970-01-01
  • 2017-01-26
  • 2016-03-20
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多