如何从基于另一个列表的列表中过滤元素并获得百分比

时间:2021-03-25 23:55:34

标签: python arrays list for-loop filter

我想从列表中获取元素,例如

appeared_elements = ['blue-sky','road','white-horse','green-field','tree','dusthaze-sky','brown-horse','yellow-field','black-bison','green-field','dusthaze-sky','dusthaze-sky','blue-sky','snowy-field'] 

并返回这些元素在另一个列表中出现的频率

objects = ['black-bison', 'elephant', 'white-horse', 'brown-horse', 'scarlet-ibis', 'black-ibis', 'white-ibis', 'blue-sky', 'overcast-sky', 'cloudy-sky', 'dusthaze-sky', 'rocky-mountain', 'snowy-mountain', 'birdseye-building', 'perspective-building', 'front-building', 'red-flower', 'purple-flower', 'pink-flower', 'sand', 'tree', 'green-field', 'snowy-field', 'yellow-field', 'road', 'tower', 'blue-ocean', 'green-cliff', 'black-cliff', 'waterfall']

我想出了一个解决方案...

def printPercentages(appeared_elements, objects):
  for n in objects:
    soma = len([m for m if n in appeared_elements])/len(appeared_elements)
    print(soma)

但是我在某个我不知道的地方失败了

1 个答案:

答案 0 :(得分:1)

我认为您可能会发现 collections.Counter 在这里是一个有用的模块。它生成一个字典,其中数组中的每个唯一项目作为键,该项目在数组中出现的次数作为值。例如,如果您有数组 ['a', 'b', 'c', 'b'],则 Counter(['a', 'b', 'c', 'b']) => {'a': 1, 'b': 2, 'c': 1}

因此,出于您的目的,您应该为 objects 数组创建一个计数器,然后使用它来确定 appeared_elements 中的一个出现在 objects 数组中的频率。< /p>

from collections import Counter

def printPercentages(objects, appeared_elements):
    counter = Counter(objects)
    soma = {}
    for e in appeared_elements:
        soma[e] = (counter.get(e) or 0)/len(objects) * 100 # this will give you the freq of each element saved to a dictionary so you can see them all.
    print(soma)

对于您提供的示例数据,您的输出将是:

{
    "black-bison": 7.142857142857142,
    "elephant": 0.0,
    "white-horse": 7.142857142857142,
    "brown-horse": 7.142857142857142,
    "scarlet-ibis": 0.0,
    "black-ibis": 0.0,
    "white-ibis": 0.0,
    "blue-sky": 14.285714285714285,
    "overcast-sky": 0.0,
    "cloudy-sky": 0.0,
    "dusthaze-sky": 21.428571428571427,
    "rocky-mountain": 0.0,
    "snowy-mountain": 0.0,
    "birdseye-building": 0.0,
    "perspective-building": 0.0,
    "front-building": 0.0,
    "red-flower": 0.0,
    "purple-flower": 0.0,
    "pink-flower": 0.0,
    "sand": 0.0,
    "tree": 7.142857142857142,
    "green-field": 14.285714285714285,
    "snowy-field": 7.142857142857142,
    "yellow-field": 7.142857142857142,
    "road": 7.142857142857142,
    "tower": 0.0,
    "blue-ocean": 0.0,
    "green-cliff": 0.0,
    "black-cliff": 0.0,
    "waterfall": 0.0
}