Кортеж пар из списка целых чисел - PullRequest
1 голос
/ 30 марта 2020

Я пытаюсь создать список пар кортежей из списка целых чисел. Список пар кортежей будет содержать пары чисел, найденные в списке. Пример ниже:

listofint = [4, 3, 1, 2, 3, 1, 1, 3, 5, 1, 2, 2]
listoftuplepairs = [(3,3),(1,1),(2,2),(1,1)]

Я запутался, как я могу реализовать это, используя понимание списка. Я попробовал это ниже, но он только возвратил пустую строку.

listoftuplepairs = [(i,listofint.remove(i)) for i in listofint if listofint.remove(i) == i]

Я понимаю, использование remove() в списке ничего не возвращает. Я экспериментировал с pop(), но я могу только передать ему индекс списка в качестве аргумента, вместо фактического значения, которое я хочу pop(), и сохранить в моем списке кортежей.

Есть ли еще какие-то другие способ сделать это через понимание списка?

1 Ответ

2 голосов
/ 30 марта 2020

Вы можете попробовать это, используя Counter

Counter, который используется для подсчета числа появлений объектов, которые могут быть хеш-объектами.

from collections import Counter
l=[4, 3, 1, 2, 3, 1, 1, 3, 5, 1, 2, 2]
c=Counter(l)
# Counter({4: 1, 3: 3, 1: 4, 2: 3, 5: 1})

[(k,k) for k,v in c.items() for _ in range(v//2)]
# [(3, 3), (1, 1), (1, 1), (2, 2)]

Итак, здесь ключ k будет числом, а значение v будет количеством раз, когда это произошло в списке. Так как вы хотели, чтобы пары получили количество пар, я сделал v//2. Вышеупомянутый подход в понимании однострочного списка будет

[(k,k) for k,v in Counter(l).items() for _ in range(v//2)]

Использование dict.fromkeys. Просто подражая тому, что Counter делает здесь.

c=dict.fromkeys(l,0)
for k in l:
    c[k]+=1

[(k,k) for k,v in c.items() for _ in range(v//2)]
...