python - 如何计算嵌套列表中多个交叉点的出现次数
问题描述
更新的问题:我有许多类似于这个的嵌套列表:
l = [['y', 'ha', 'ua', 'uk'], ['o', 'j', 'sb', 'ku'],
['j', 'c', 'ts', 'ar'], ['nec', 'hv', 'f', 'uf'],
['y', 'nec', 'fs', 'ks']]
每个列表是一组人,每个子列表是一个人的特征。我想计算具有重叠特征的人数。
我创建了一个计数器字典来查找所有 > 1 的结果。
dups = dict((k, v) for k, v in dups.items() if (v >= 2))
#{'y': 2, 'j': 2, 'nec': 2}
如果我将 dups 的值加在一起,当只有 5 个子列表时,我得到 6。我需要找到具有多个重叠值的所有子列表。
换句话说,我的问题是如何获得 5(因为所有 5 个子列表至少有 1 个共同值)。
我尝试按如下方式创建组合:
import itertools
characteristics = list(dups.keys())
set_c = set(characteristics)
combos = list(itertools.combinations(set_c, 2))
sub_list = list(combos)
sub_list2 = [list(x) for x in sub_list]
print(sub_list2)
#[['nec', 'y'], ['nec', 'j'], ['y', 'j']]
我尝试了下面的代码,但它有问题(比如它不计算多个布尔值):
counter = 0
if (all(x for y in l for x in sub_list2)):
counter += 1
print(counter)
else:
print("No, list is not subset of other.")
有什么想法吗?
解决方案
我不清楚要求,但这可能是您正在寻找的:
l = [['y', 'ha', 'ua', 'uk'],
['o', 'j', 'sb', 'ku'],
['j', 'c', 'ts', 'ar'],
['nec', 'hv', 'f', 'uf'],
['y', 'nec', 'fs', 'ks']]
# get all keys
all = set()
for l2 in l:
all |= set(l2) # merge elements, remove duplicates
d = {k:0 for k in all} # dictionary for counts
for l1 in l:
for e in l1:
d[e] += 1
t = [(k,d[k]) for k in d if d[k] > 1] # remove count = 1
print(t)
输出
[('j', 2), ('nec', 2), ('y', 2)]
推荐阅读
- linux - 从 Windows 上的 spark 存储文件到 HDFS
- php - 访问 WC() 以在 ajax 回调中获取购物车内容
- swift - 我在哪里可以找到媒体按钮以将我的资产放到情节提要中
- oop - 支持字段公开时自动生成getter和setter的目的是什么
- python - Django中的简单查询
- java - ncpu.s 文件加载到错误的 'utf-8' android studio
- c# - .netcore Web 应用程序因“提供给函数的缓冲区太小”错误而失败
- javascript - 解析浮点数和 toFixed()
- angular - 以角度 6 显示 Spinner 直到 API 响应
- unity3d - 广告未在 Game Unity 上展示