Получение списка упорядоченных целых чисел из списка «пар» в Python - PullRequest
0 голосов
/ 25 февраля 2020

Здравствуйте. В настоящее время я работаю с большим набором данных, который содержит четное количество целых чисел, каждое из которых имеет совпадающее значение. Я пытаюсь создать список, состоящий из "один из пары" в Python. Я могу иметь несколько пар одинакового значения, поэтому простое использование функции set не работает. Например, если у меня есть список:

List = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]

В этом примере индексы 0 и 1 будут парой, тогда 2 и 7, 3 и 5, 4 и 6, 8 и 9.

Я хочу извлечь из этого списка значения, составляющие каждую пару, и создать новый список с указанными значениями для создания чего-то такого as:

newList = [10, 11, 20, 15, 10]

Использование функции set делает так, что в список помещается только один элемент из всего набора данных, где мне нужна половина всех данных из List. Для ситуаций, когда у меня более одной пары одного и того же значения, это выглядело бы так:

List = [10, 10, 11, 10, 11, 10]

Потребовалось бы создать список, такой как:

newList = [10, 11, 10]

Любое понимание было бы здорово, так как я новичок в Python и есть множество функций, о которых я, возможно, не знаю.

Спасибо

Ответы [ 6 ]

1 голос
/ 26 февраля 2020

Вот небольшое отклонение от одного из ответов @Alain T:

 [i for s in [set()] for i in List if (s.remove(i) if i in s else (not s.add(i)))] 

Примечание: ниже был мой ответ до того, как вы добавили требование заказа

sorted(List)[::2]

Это сортирует введите List и затем возьмите только одно значение из каждых двух последовательных.

1 голос
/ 25 февраля 2020

Если я правильно понял, вы не хотите иметь дублирующее значение, хотите сохранить список с уникальными значениями из определенного списка.

Если я прав, простой способ сделать это будет:

List = [10, 10, 11, 11, 15, 20, 15, 20]
newList = []
for x in List:
    if x not in newList:
        newList.append(x)

print(newList)

A python -подобным способом будет:

newList = set(List)
1 голос
/ 25 февраля 2020

Просто попробуйте:

new_list = set(list)

Это должно вернуть желаемый результат.

0 голосов
/ 27 февраля 2020

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

List = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]

paired = [ i for pairs in [set()] for i in List if pairs.symmetric_difference_update({i}) or i in pairs]
print(p)
# [10, 11, 20, 15, 10]

Вы также можете сделать это с помощью функции накопления из itertools:

from itertools import accumulate
paired = [a for a,b in zip(List,accumulate(({n} for n in List),set.__xor__)) if a in b]
print(paired)
# [10, 11, 20, 15, 10]

Или используйте растровое изображение вместо набора (если ваши значения являются относительно небольшими положительными целыми числами (например, между 0 и 64):

paired = [ n for n,m in zip(List,accumulate((1<<n for n in List),int.__xor__)) if (1<<n)&m ]
print(paired)
# [10, 11, 20, 15, 10]

Или вы можете использовать Счетчик из коллекций

from collections import Counter
paired = [ i for c in [Counter(List)] for i in List if c.update({i:-1}) or c[i]&1 ]
print(paired)
# [10, 11, 20, 15, 10]

И, если вы не слишком беспокоитесь об эффективности, это может сделать двойная сортировка с двухступенчатым шагом:

paired = [List[i] for i,_ in sorted(sorted(enumerate(List),key=lambda n:n[1])[::2])]
print(paired)
# [10, 11, 20, 15, 10]
0 голосов
/ 25 февраля 2020

Следующий код создает новый список с половиной числа элементов, встречающихся в списке ввода. Порядок в порядке первого вхождения в списке ввода.

>>> from collections import Counter
>>> d = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]
>>> c = Counter(d)
>>> c
Counter({10: 4, 11: 2, 20: 2, 15: 2})
>>> answer  = sum([[key] * (val // 2) for key, val in c.items()], [])
>>> answer
[10, 10, 11, 20, 15]
>>> 
0 голосов
/ 25 февраля 2020

В общем случае это будет сделано:

l = [10, 10, 11, 20, 15, 20, 15, 11, 10, 10]
i = 0
while i < len(l):
    del l[l.index(l[i], i + 1)]
    i += 1

Он перебирает список один за другим, находя индекс вхождения next текущего значения, и удаляет его, сокращая список. Вероятно, это можно одеть разными способами, но это простой алгоритм. Если у числа , а не есть подходящая пара, это увеличит ValueError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...