2015-12-08 10 views
5

ja mam słowniki, takie jak:wyprowadzenie wszystkich przedłużenie łańcucha w liście

'1' : ['GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC'] 

'2' : ['GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 'GAGAGAGACAUAGAGG'] 

'3' : ['GUC', 'GUCU', 'GUCUU', 'GUCUUU', 'GUCUUUG', 'GUCUUUGU', 'GUCUUUGU"', 'GUCUUUGU"G', 'GUCUUUGU"GU', 'GUCUUUGU"GUA', 'GUCUUUGU"GUAC', 'GUCUUUGU"GUACA', 'GUCUUUGU"GUACAU', 'GUCUUUGU"GUACAUC'] 

staram się zrobić to tak, że program może znaleźć najkrótszą podciąg na liście (takie jak w GAA pierwszy) i użyj go, aby znaleźć wszystkie inne wpisy, które są po prostu rozszerzeniami GAA (ciągi zaczynające się od GAA i po prostu mają dodatkowe litery) i usuwa je.

Wiem, że pojawiło się wiele pytań dotyczących usuwania elementów z listy, ale żadna z nich nie pomoże mi w rozwiązaniu tego problemu.

+0

Korzystanie z Regex byłoby lepszym rozwiązaniem. – ZdaR

+0

w jaki sposób regex pomoże mi @ZdaR? Przepraszam. Próbuję zautomatyzować to wszystko, więc na każdej liście 1, 2, 3, aby użyć różnych ciągów "GAA", "GAG", "GUC" nie jest dla mnie naprawdę opcją – lamazibiji

+0

Nie koduj zwykłego Wyrażenie, zamiast tego utwórz Regex w locie z pierwszym elementem listy. – ZdaR

Odpowiedz

4
>>> dictionary={ '1': ['GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU', 
        'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC', 
        'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG', 
        'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC', 
        'RTRSRS','GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA', 
        'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA', 
        'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG', 
        'GAGAGAGACAUAGAGG']} 
>>> new_dict = {} 

>>> for i in dictionary: 
     l = len(min(dictionary[i], key=len)) 
     m = [x for x in dictionary[i] if len(x)==l] 
     temp = [] 
     temp.extend(m) 
     for k in dictionary[i]: 
      if not any(map(lambda j: k.startswith(j), m)): 
       temp.append(k) 
     new_dict[i] = temp 

>>> print(new_dict) 
# {'1': ['GAA', 'GAG', 'RTRSRS']} 
+1

Dzięki, że naprawiłem to w moim kodzie, więc działało prawidłowo, ale wydaje się, że usunęło około 1000 podciągów, ale są jeszcze tysiące pozostałych, które nie zostały usunięte. Czy dzieje się tak dlatego, że istnieje wiele 3-literowych łańcuchów, które są wydłużone przez inne litery, a nie tylko jedną "GAA" na liście 1? – lamazibiji

+0

Aaah! Wiem, że dużo pytam, ale w jaki sposób chciałbym użyć go zamiast wielokrotnego użycia 1? – lamazibiji

+0

@lamazibiji sprawdź ten, jeśli nadal się nie udaje, czy możesz podać przykładowy wynik? –

2

Twoje przykładowe dane nie są naprawdę dobre. Wszystkie inne wpisy rozpoczynają się od najkrótszego ciągu znaków. Dlatego wszystkie zostaną usunięte. Tutaj krótsza wersja z innego wpisu:

data = {'1' : ['GAA', 'xxxxxxx', 'GAAA', 'GAAAA', 'GAAAAA'], 
     '2' : ['GAG', 'yyyyyyyy', 'GAGA', 'GAGAG', 'GAGAGA'], 
     '3' : ['GUC', 'zzzzzz', 'GUCU', 'GUCUU', 'GUCUUU']} 

Teraz:

res = {} 
for key, value in data.items(): 
    shortest = min(value, key=len) 
    res[key] = [entry for entry in value if not entry.startswith(shortest) 
       or entry == shortest] 

>>> res 
{'1': ['GAA', 'xxxxxxx'], '2': ['GAG', 'yyyyyyyy'], '3': ['GUC', 'zzzzzz']} 

Uwaga: To również utrzymuje pozycję najkrótszego ciągu znaków w stosunku do innych, które pozostają. Na wszelki wypadek.

Powiązane problemy