2015-12-10 11 views
7

üst üste birleştirme iki dizeleri:Python Ben tam adresi oluşturmak için çalışıyorum içine arıyorum, ama ben veri şeklinde gelir

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

bu verilerin nasıl bir kaç başka permütasyon vardır yaratıldı, ancak bunların tümünü örtüşme olmayan tek bir dizeye dahil etmek istiyorum. Yani dize oluşturmak istiyorum:
1, First Street, City, X13

Ama 1, First Street, First Street, City, X13 vb

nasıl Concat veya zaten orada verileri yinelemeden bu birleştirebilirsiniz? İlk hücreyi geçmeyen herhangi bir bilgi bulunmayan üst satırdaki gibi bazı hücreler de vardır.

+1

Geçerli bir kombinasyonun hangisi olduğuna nasıl karar veriyorsunuz yoksa kelimelerin tekrarlanmayacağından emin misiniz? –

cevap

2

Eğer , ile çizgiler ayrı alanlar almak için hat almak için \n metninizi bölebilirsiniz düz metin var ve bölerseniz:

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

Not bir daha pythonic olarak yolu, sınırlayıcı olarak virgül ,'u belirterek metninizi okumak için csv modülünü kullanabilirsiniz.

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

Not zip() işlevini kullanarak sütunları almak ve sonra regex ile re.split() öğeleri ayırabilirsiniz burada:

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

Sonra her sütunda benzersiz alan almak için Aşağıdaki liste anlama kullanabilirsiniz r'\s{2,}', dizginizi 2 veya daha fazla beyaz boşlukla böler, böylece benzersiz öğeleri korumak için set() dava edebilirsiniz.

Not: sipariş veriyorsan sen kaybetme noktalama sakıncası yoksa collections.OrderedDict yerine 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

Her içerik bir panda tablosundaki farklı hücrelerde. Bu yüzden hücrelerin içeriğini kelimeleri tekrar etmeden birleştirmenin bir yoluna ihtiyacım var. – Abi

+0

@Abi Tabloyu okuyabilir ve satırları "splitted_lines" gibi yinelenen bir nesneye koyabilir ve daha sonra yukarıda belirtilen liste kavrayışına ekleyebilirsiniz. – Kasramvd

+0

@PadraicCunningham Yep Ben de eklendi ve OrderedDict yaklaşımı ve X13 eksik eksik ayırıcı nedeniyle oldu. – Kasramvd

2

ait kullanabilirsiniz: kazandınız

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 

Eğer tekrarlanan varsa kelimeleri' Yaklaşımı kullanabilmeniz mümkün fakat girişinize dayanarak, mümkün olan kombinasyonun mümkün olabileceğini bilmenin bir yolu yok, ikinci satır aslında her zaman bozulmamış durumdadır, bu durumda ikinci satırı çekmeniz yeterli olacaktır.

İlgili konular