2015-12-10 3 views
3

У меня есть список пар ключ/значениеpython2.7: значения подсчета в пары ключ/значение

Я хотел бы рассчитывать уникальные значения в парах

пример списка

[(12, 0), (10, 1), (11, 777), (11, 0) ,(10, 1)] 

результат что-то вроде:

[(12, 0, 1), (10, 1 , 2), (11, 777, 1), (11, 0, 1)] 

Я пытался операции на карте, но не удалось Спасибо!

+2

Каковы пары? Когда значение уникально? –

+0

Вы можете использовать dict с парами в первом списке в качестве ключей. –

+0

Я хотел бы построить метод – Toren

ответ

3

Использование collections.Counter:

>>> from collections import Counter 
>>> 
>>> lst = [(12, 0), (10, 1), (11, 777), (11, 0) ,(10, 1)] 
>>> [key + (cnt,) for key, cnt in Counter(lst).items()] 
[(11, 0, 1), (11, 777, 1), (10, 1, 2), (12, 0, 1)] 
+0

Спасибо! Я пытаюсь построить функцию: из коллекции import Counter def count_list ([lst]): [key + (cnt,) для ключа, cnt в Counter (lst) .items()] – Toren

+0

Я новичок в python, я хотел бы построить метод. – Toren

+0

@Toren, 'def method (lst): return [key + (cnt,) для ключа, cnt в Counter (lst) .items()]' – falsetru

2

collections.Counter Использование:

>>> from collections import Counter 
>>> a =[(12, 0), (10, 1), (11, 777), (11, 0) ,(10, 1)] 

>>> [(*i,j) for (i,j) in Counter(a).items()] 
# [(11, 0, 1), (11, 777, 1), (10, 1, 2), (12, 0, 1)] 

>>> [i for i in Counter(a).items()] 
# [((11, 0), 1), ((11, 777), 1), ((10, 1), 2), ((12, 0), 1)] 
+2

['(* i, j)' синтаксис доступен в Python 3.5+] (https://docs.python.org/3/whatsnew/3.5.html#whatsnew-pep-448). Вопрос помечен 'python-2.7' – falsetru

1

бы что-то вроде этой работы для вас?

your_list = [(12, 0), (10, 1), (11, 777), (11, 0) ,(10, 1)] 
result = [(a,b,your_list.count((a,b))) for (a,b) in your_list] 
# [(12, 0, 1), (10, 1, 2), (11, 777, 1), (11, 0, 1), (10, 1, 2)] 

Если вы хотите, чтобы каждый вход только один раз вы могли бы сделать

set(result) 
# set([(12, 0, 1), (11, 0, 1), (11, 777, 1), (10, 1, 2)]) 
+1

Это может быть объединено в: 'result = [(a, b, l.count ((a, b))) для (a, b) в наборе (l)]' –

1

Вы также можете сделать это с встроенным map методом, таким образом:

>>> l = [(12, 0), (10, 1), (11, 777), (11, 0) ,(10, 1)] 
>>> result = [] 
>>> map(lambda s: result.append((s[0],s[1],l.count(s))), set(l)) 
[None, None, None, None] 
>>> result 
[(11, 0, 1), (11, 777, 1), (10, 1, 2), (12, 0, 1)] 
+0

Отлично! Может ли этот код быть преобразован в карту PySpark? – Toren

Смежные вопросы