2015-12-10 12 views
7

Sto cercando di cercare di creare un indirizzo completo, ma i dati che ho si presenta sotto forma di:Python - Unione di due stringhe che si sovrappongono

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

Ci sono alcune altre permutazioni di come questi dati è creato, ma voglio essere in grado di unire tutto questo in una stringa dove non c'è sovrapposizione. Quindi voglio creare la stringa:
1, First Street, City, X13

Ma non 1, First Street, First Street, City, X13 ecc

Come posso concat o unire questi senza duplicazione di dati già lì? Ci sono anche alcune celle come nella riga superiore dove non ci sono informazioni oltre la prima cella.

+1

come si decide quale combinazione è valida o si è sicuri che le parole non si ripetano? –

risposta

2

Se si dispone di un solo testo è possibile dividere il testo con \n al fine di ottenere la linea e dividere le linee con , per ottenere i campi separati:

>>> 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] 

Nota che come un più divinatorio modo è possibile utilizzare il modulo csv per leggere il testo specificando la virgola , come delimitatore.

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

quindi è possibile utilizzare l'elenco seguente di comprensione per ottenere i campi unici in ogni colonna:

>>> 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' 

Si noti che qui si possono ottenere le colonne utilizzando zip() funzione e poi dividere gli oggetti con re.split() con espressioni regolari r'\s{2,}' che ha diviso la stringa con 2 o più spazi bianchi, quindi puoi fare causa set() per preservare gli oggetti unici.

Nota: Se vi preoccupate per l'ordine si può usare al posto di collections.OrderedDictset

>>> 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

Ciascuno dei contenuti si trova in celle diverse in una tabella panda. Quindi ho bisogno di un modo per unire il contenuto delle celle senza ripetere le parole. – Abi

+0

@Abi È possibile leggere la tabella e inserire le righe in un oggetto iterabile come 'splitted_lines', quindi inserirla nella sopra menzionata lista di comprensione. – Kasramvd

+0

@PadraicCunningham Sì, ho aggiunto anche l'approccio OrderedDict e mancava il 'X13' a causa del delimitatore omesso. – Kasramvd

2

Se non ti dispiace la punteggiatura perdere:

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 

Se avete ripetuto le parole che hai vinto' essere in grado di utilizzare l'approccio, ma sulla base dei tuoi input non c'è modo di sapere quale combinazione possibile è possibile, a patto che la seconda linea sia sempre intatta, nel qual caso dovrai solo tirare la seconda linea.

Problemi correlati