Используя карту и фильтр / уменьшить, чтобы посчитать, сколько раз вещи встречаются в последовательности (Python) - PullRequest
0 голосов
/ 31 января 2012

Мне нужно составить список из 50 случайных цветов, а затем посчитать, сколько раз каждый цвет появлялся в этой последовательности. единственный способ сделать это, как показано ниже:

colours = [ "Red", "Blue", "Green", "Yellow", "Purple", "Orange", "White", "Black" ]
numbers = map(lambda x : random.randint(0,7), range(50))
randomcolours = map(lambda i: colours[i], numbers)
print randomcolours
x=collections.Counter(randomcolours)
print x

но мне нужно сделать это, поэтому я использую карту и фильтрую или уменьшаю .. я не могу понять, как это сделать таким образом?

Ответы [ 2 ]

1 голос
/ 31 января 2012
random_colors = [random.choice(colors) for x in range(50)]

#because python's lambda is crappy, an extra local/global function must be defined
def count_color(di, color):
    di.setdefault(color, 0)
    di[color] = di[color]+1
    return di

result = reduce(count_color, random_colors, {})
#The result is what you want
0 голосов
/ 31 января 2012

Вы можете использовать random.choice() для заполнения списка random_colors:

random_colors = [random.choice(colors) for x in range(50)]

И затем один способ подсчитать все вхождения, используя map() и filter() canбыть:

c = dict(map(lambda to_filter: (to_filter, len(filter(lambda x: to_filter == x, random_colors))), colors))
...