2013-11-19 2 views
2

Я новичок в Python, и я нахожу set() немного запутанным. Может ли кто-нибудь помочь в поиске и создании нового списка уникальных номеров (другие слова исключают дубликаты)?Уникальные значения Python в списке

import string 
import re 

def go(): 
     import re 
     file = open("C:/Cryptography/Pollard/Pollard/newfile.txt","w") 
     filename = "C:/Cryptography/Pollard/Pollard/primeFactors.txt" 
     with open(filename, 'r') as f: 
       lines = f.read() 

       found = re.findall(r'[\d]+[^\d.\d+()+\s]+[^\s]+[\d+\w+\d]+[\d+\^+\d]+[\d+\w+\d]+', lines) 
       a = found 
       for i in range(5): 
         a[i] = str(found[i]) 
         print(a[i].split('x')) 

Теперь

print(a[i].split('x')) 

.... дает следующий вывод

['2', '3', '1451', '40591', '258983', '11409589', '8337580729', 
'1932261797039146667'] 

['2897', '514081', '585530047', '108785617538783538760452408483163'] 

['2', '3', '5', '19', '28087', '4947999059', 
'2182718359336613102811898933144207'] 

['3', '5', '53', '293', '31159', '201911', '7511070764480753', 
'22798192180727861167'] 

['2', '164493637239099960712719840940483950285726027116731'] 

Как вывести список только не являющихся повторяющимися числами? Я читал на форумах, что «set()» может это сделать, но я пробовал это безрезультатно. Любая помощь высоко ценится!

+0

Я не уверен, что понимаю. Ни один из списков, которые вы показываете, не имеет внутренних значений. Вас беспокоит наличие дубликатов в некоторых других значениях, но (по совпадению) их нет в первых пяти, которые вы показали? Или вам нужно устранить дубликаты между списками, чтобы '2' отображался только в первом списке, но не третий или пятый? – Blckknght

+0

Простите, что поздно ночью, я имел в виду, «не повторяю значения, если я объединю весь список вместе» –

ответ

4

set коллекция (как list или tuple), но не допускает дубликатов и имеет очень быстрое тестирование членства. Вы можете использовать список понимание, чтобы отфильтровать значения в одном списке, которые появились в предыдущем списке:

data = [['2', '3', '1451', '40591', '258983', '11409589', '8337580729', '1932261797039146667'], 
     ['2897', '514081', '585530047', '108785617538783538760452408483163'], 
     ['2', '3', '5', '19', '28087', '4947999059', '2182718359336613102811898933144207'], 
     ['3', '5', '53', '293', '31159', '201911', '7511070764480753', '22798192180727861167'], 
     ['2', '164493637239099960712719840940483950285726027116731']] 

seen = set() # set of seen values, which starts out empty 

for lst in data: 
    deduped = [x for x in lst if x not in seen] # filter out previously seen values 
    seen.update(deduped)      # add the new values to the set 

    print(deduped)        # do whatever with deduped list 

Выход:

['2', '3', '1451', '40591', '258983', '11409589', '8337580729', '1932261797039146667'] 
['2897', '514081', '585530047', '108785617538783538760452408483163'] 
['5', '19', '28087', '4947999059', '2182718359336613102811898933144207'] 
['53', '293', '31159', '201911', '7511070764480753', '22798192180727861167'] 
['164493637239099960712719840940483950285726027116731'] 

Обратите внимание, что эта версия не отфильтровывать значения, которые дублируются в пределах один список (если они уже не дублируют значение в предыдущем списке). Вы можете обойти это, заменив понимание списка на явный цикл, который проверяет каждое отдельное значение на seenadd, если он новый), перед добавлением в список для вывода. Или, если порядок элементов в ваших подсписках не важен, вы можете превратить их в наборы своих собственный:

seen = set() 
for lst in data: 
    lst_as_set = set(lst)    # this step eliminates internal duplicates 
    deduped_set = lst_as_set - seen  # set subtraction! 
    seen.update(deduped_set) 

    # now do stuff with deduped_set, which is iterable, but in an arbitrary order 

Наконец, если внутренние суб-листы красной сельди целиком, и вы хотите просто фильтровать уплощенный список, чтобы получить только уникальные значения, это звучит как работа для unique_everseen рецепта из itertools documentation:

def unique_everseen(iterable, key=None): 
    "List unique elements, preserving order. Remember all elements ever seen." 
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D 
    # unique_everseen('ABBCcAD', str.lower) --> A B C D 
    seen = set() 
    seen_add = seen.add 
    if key is None: 
     for element in ifilterfalse(seen.__contains__, iterable): 
      seen_add(element) 
      yield element 
    else: 
     for element in iterable: 
      k = key(element) 
      if k not in seen: 
       seen_add(k) 
       yield element 
2

set должен работать в этом случае.

Вы можете попробовать следующее:

# Concat all your lists into a single list 
>>> a = ['2', '3', '1451', '40591', '258983', '11409589', '8337580729','1932261797039146667'] +['2897', '514081', '585530047', '108785617538783538760452408483163'] +['2', '3', '5', '19', '28087', '4947999059','2182718359336613102811898933144207'] + ['3', '5', '53', '293', '31159', '201911', '7511070764480753', '22798192180727861167']+ ['2', '164493637239099960712719840940483950285726027116731'] 
>>> len(a) 
29 
>>> set(a) 
set(['514081', '258983', '40591', '201911', '11409589', '585530047', '3', '2', '5', '108785617538783538760452408483163', '2279819218\ 
0727861167', '164493637239099960712719840940483950285726027116731', '8337580729', '4947999059', '19', '2897', '7511070764480753', '5\ 
3', '28087', '2182718359336613102811898933144207', '1451', '31159', '1932261797039146667', '293']) 

>>> len(set(a)) 
24 
>>> 
+0

Спасибо, теперь я борюсь с объединением отдельных списков вместе ... –

+0

Для будущего ref. concat_list = list1 + list2 + list3 + ... + listn – smashbro

0

Если вы хотите уникальные значения из уплощенного списка, вы можете использовать уменьшить(), чтобы сгладить список. Затем используйте конструктор frozenset(), чтобы получить список результатов:

>>> data = [ 
    ['2', '3', '1451', '40591', '258983', '11409589', '8337580729', '1932261797039146667'], 
    ['2897', '514081', '585530047', '108785617538783538760452408483163'], 
    ['2', '3', '5', '19', '28087', '4947999059', '2182718359336613102811898933144207'], 
    ['3', '5', '53', '293', '31159', '201911', '7511070764480753', '22798192180727861167'], 
    ['2', '164493637239099960712719840940483950285726027116731']] 

>>> print list(frozenset(reduce((lambda a, b: a+b), data))) 
['514081', '258983', '40591', '201911', '11409589', '585530047', '3', 
'2', '5', '108785617538783538760452408483163', '22798192180727861167', 
'164493637239099960712719840940483950285726027116731', '8337580729', 
'4947999059', '19', '2897', '7511070764480753', '53', '28087', 
'2182718359336613102811898933144207', '1451', '31159', 
'1932261797039146667', '293'] 
Смежные вопросы