Mam listę list, który wygląda jakJak uzyskać liczbę list z określonym elementem?
listOfLists = [
['a','b','c','d'],
['a','b'],
['a','c'],
['c','c','c','c']
]
Chcę policzyć liczbę list, które mają konkretny element. Na przykład, mój wynik powinien wynosić:
{'a':3,'b':2,'c':3,'d':1}
Jak widać, nie potrzebuję całkowitej liczby elementów. W przypadku "c"
, chociaż jego całkowita liczba to 5, wynik wynosi 3, ponieważ występuje tylko na 3 listach.
Używam licznika do liczenia. To samo widać poniżej.
line_count_tags = []
for lists in lists_of_lists:
s = set()
for element in lists:
s.add(t)
lines_count_tags.append(list(s))
count = Counter([count for counts in lines_count_tags for count in counts])
Więc, kiedy mogę wydrukować liczyć, mam
{'a':3,'c':3,'b':2,'d':1}
Chcę wiedzieć, czy jest to znacznie lepszy sposób, aby osiągnąć swój cel.
Dostaję znacznie szybszą realizację przy użyciu 'itertools.chain' (~ 40%!) Na CPython 2.7.11. Mimo to 'Counter' +' itertools.chain' wykonuje 4 razy wolniej niż metoda 'raw', którą przedstawiłem. – zwer
@zwer Eh, zależy od rozmiaru wejściowego, który omawiamy. Moje rozwiązanie ma więcej narzutów, ale jeśli zwiększysz rozmiar wejściowy, będzie on szybszy. To dlatego benchmarking nie jest aż tak ważny :) – miradulo
To prawda, byłem zaskoczony, że różnica prędkości w moim miejscu była zaskoczona. Nie jestem przyzwyczajony do tego, że 'itertools' faktycznie przewyższają, no, właściwie wszystko - są zwykle wolniejszy, ale łatwiejszy do odczytania wybór: D – zwer