2015-12-10 12 views
7

szukam do próby utworzenia pełnego adresu, ale dane mam jest w formie:Python - Scalanie dwa ciągi, które pokrywają

Line 1      | Line 2     | Postcode 
1, First Street, City, X13 
1, First Street    First Street, City   X13 
1       1, First Street, City, X13 X13 

Istnieje kilka innych permutacje, jak te dane są utworzone, ale chcę móc scalić to wszystko w jeden ciąg, w którym nie ma nakładania się. Więc chcę, aby utworzyć ciąg:
1, First Street, City, X13

Ale nie 1, First Street, First Street, City, X13 itp

Jak mogę Concat lub połączyć je bez powielania danych już istnieje? Istnieją również komórki, takie jak na górnej linii, gdzie nie ma informacji poza pierwszą komórką.

+1

jak zdecydujesz, co jest poprawną kombinacją, czy na pewno słowa nie będą się powtarzać? –

Odpowiedz

2

Jeśli masz zwykły tekst można podzielić tekst z \n w celu uzyskania linii i podzielić linie z , aby uzyskać osobne pola:

>>> s = """1, First Street, City, X13 
... 1, First Street    First Street, City,   X13 
... 1       1, First Street, City, X13 X13""" 
>>> 
>>> lines = s.split('\n') 
>>> 
>>> splitted_lines = [line.split(',') for line in lines] 

Uwaga że jako bardziej pythonic sposób można użyć modułu csv do odczytania tekstu, określając przecinek , jako ogranicznik.

import csv 
with open('file_name') as f: 
    splitted_lines = csv.reader(f,delimiter=',') 

Następnie można użyć następującej listy ze zrozumieniem, aby uzyskać unikalne pól w każdej kolumnie:

>>> import re 
>>> ' '.join([set([set(re.split(r'\s{2,}',i)).pop() for i in column]).pop() for column in zip(*splitted_lines)]) 
'1 First Street City' 

Należy zauważyć, że tutaj można uzyskać kolumny używając zip() funkcję, a następnie podzielić przedmioty z re.split() z regex r'\s{2,}', które podzieliły twój ciąg na 2 lub więcej białych znaków, następnie można pozwać set(), aby zachować unikatowe przedmioty.

Uwaga: Jeśli dbasz o celu można użyć collections.OrderedDict zamiast set

>>> from collections import OrderedDict 
>>> 
>>> d = OrderedDict() 
>>> ' '.join([d.fromkeys([set(re.split('\s{2,}',i)).pop() for i in column]).keys()[0] for column in zip(*splitted_lines)]) 
'1 First Street City X13' 
+0

Każda z zawartości znajduje się w różnych komórkach w tabeli pandy. Potrzebuję więc sposobu na scalenie zawartości komórek bez powtarzania słów. – Abi

+0

@Abi Możesz odczytać tabelę i umieścić wiersze w obiekcie iterowalnym, np. 'Splitted_lines', a następnie umieścić ją we wspomnianym wyżej spisie. – Kasramvd

+0

@PadraicCunningham Yep dodałem i podejście OrderedDict również, a brak '' X13' był z powodu pominiętego ogranicznika. – Kasramvd

2

Jeśli nie przeszkadza tracąc interpunkcyjne

from collections import OrderedDict 
od = OrderedDict() 


from string import punctuation 
with open("test.txt") as f: 
    next(f) 
    print("".join(od.fromkeys(word.strip(punctuation) for line in f  
      for word in line.split()))) 

1 First Street City X13 

Jeśli powtarzające się wyrazy You won” t móc korzystać z podejścia, ale w oparciu o dane wejściowe nie ma sposobu, aby dowiedzieć się, jaka możliwa kombinacja jest możliwa, przy czym druga linia jest zawsze nienaruszona, w takim przypadku wystarczy przeciągnąć drugą linię.