如何计算 python 中每个项目的唯一子项目?

How to count each items unique sub-items in python?

在这个问题中,我只能使用 numpy,特别是我有一个药物及其副作用的 csv 列表, 我想找出每种独特药物的副作用数量。 我有这样的文件

  1. [药一,东西,东西,腰痛

  2. 药物一,东西,东西,眼痛

  3. 药二,某事,某事,皮肤病

  4. 药三,有事,有事,腰疼

  5. 药三,东西,东西,休克

关键是创建一个包含药物本身的列表,然后列出附近的副作用数量,我会编写这样的代码

listall = [ ]

filename = "druglist.csv"

file_to_open = open(filename,"r")
counter = 0
for line in file_to_open:
    
line = line.strip()
line = line.split(",")
if line[0] not in listall:
  listall.append(line[0])
  counter = counter+1
  
  listall.append(counter)
else:
  counter = counter+1
  listall.append(counter)

print(listall)
print(counter)

我知道这不是计算每个的独特副作用,也不是为每个成功添加它们。 我找不到任何创建这样的列表以创建直方图分布的原因。

你需要数据结构。对于这个工作,你能不能用一个字典,以药物名称为键,一组副作用为值。

此代码是一个示例,您可能需要对其进行调整,但它应该能说明这个想法。

from collections import defaultdict

filename = "druglist.csv"
file_to_open = open(filename,"r")
drug_side_effects = defaultdict(set)

for line in file_to_open:
    line = line.strip().split(",")
    drug = line[0]
    side_efffects = line[1:]
    drug_side_effects[drug].union(set(side_effects))

for drug, side_effects in drug_side_effects.items():
    print(f"{drug} has {len(side_effects)}"

那么这里发生了什么?我们创建一个 defaultdict 映射药物名称到一组副作用。我们打开文件并读入每一行。然后我们拆分每一行,其中列表的第一个元素是药物名称,其余是副作用。现在我们通过药物名称访问 defaultdict:如果密钥已经存在,我们将获得一组副作用。如果它不在那里,我们得到一个空集。这个集合,无论是否为空,都被 union 与来自这个 line 的副作用集合相结合,结果,一个包含两个列表的所有唯一元素的集合,然后被存储回字典中在 drug 键下。所以我们最终得到了 {drug:set_of_side_effects} 的字典。然后我们可以打印出每个键(药物名称)和副作用的数量。

根据列表的设置方式,您可能需要对数据进行一些清理,因为 'Back Pain' 和 'backpain' 会显示为两种不同的副作用,但保留为reader.

的练习