Поиск только пар в списке, используя понимание списка - PullRequest
0 голосов
/ 15 мая 2019

В поисках причудливого однострочного решения для поиска пар элементов в списке с использованием понимания списка.

У меня есть код, который находит кратные, но не могу понять, как разбить эти кратные на пары.

lst = [1,2,4,2,2,3,3,1,1,1,2,4,3,4,1]
len(set([x for x in lst if lst.count(x) > 1]))

Код выше возвращает 4.Ответ должен быть 6 пар, [1,1,1,1,1] = 2, [2,2,2,2] = 2, [3,3,3] = 1 и [4,4,4] = 1.

Ответы [ 3 ]

3 голосов
/ 15 мая 2019

Другим подходом будет использование [Python 3.Docs]: класс коллекций. Счетчик ( [итерируемый или отображаемый] )

>>> from collections import Counter
>>>
>>> lst = [1, 2, 4, 2, 2, 3, 3, 1, 1, 1, 2, 4, 3, 4, 1]
>>>
>>> c = Counter(lst)
>>> c
Counter({1: 5, 2: 4, 4: 3, 3: 3})
>>>
>>> sum(item // 2 for item in c.values())
6

и эквивалент в одну строку:

>>> sum(item // 2 for item in Counter(lst).values())
6
1 голос
/ 15 мая 2019

Однострочник без других промежуточных переменных будет:

sum(lst.count(x)//2 for x in set(lst))

Зацикливается на set(lst), который содержит все различные числа в lst, и добавляет их количество пар.

1 голос
/ 15 мая 2019

Вы можете сделать следующее (если я правильно понял ваш метод сопряжения):

lst = [1,2,4,2,2,3,3,1,1,1,2,4,3,4,1]
the_dict = {x: int((lst.count(x)/2)) for x in lst}

print(sum(the_dict.values()))

> 6

print(the_dict)

> {1: 2, 2: 2, 4: 1, 3: 1}

Это делает словарь с количеством всех пар, затем вы можете суммировать значения в словаре, чтобы получить количество пар. Тогда вам также будет доступен словарь с количеством пар каждого значения, если вам это нужно.

...