我正在尝试创建一个完整的地址,但我得到的数据是:
Line 1 | Line 2 | Postcode
1, First Street, City, X13
1, First Street First Street, City X13
1 1, First Street, City, X13 X13
还有一些关于如何创建这些数据的其他排列,但我希望能够将所有这些合并到一个没有重叠的字符串中。所以我想创建字符串:
1, First Street, City, X13
但不是1, First Street, First Street, City, X13
等。
如何在不复制数据的情况下连接或合并这些?在顶线上还有一些单元格,其中没有信息通过第一个单元格。
答案 0 :(得分:2)
如果您有纯文本,则可以使用\n
拆分文字以获取该行,并使用,
拆分行以获取单独的字段:
>>> 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]
注意通过将逗号csv
指定为分隔符,您可以使用,
模块来阅读文本,这是一种更加pythonic的方法。
import csv
with open('file_name') as f:
splitted_lines = csv.reader(f,delimiter=',')
然后,您可以使用以下列表推导来获取每列中的唯一字段:
>>> 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'
请注意,您可以在此处使用zip()
功能获取列,然后将re.split()
项与正则表达式r'\s{2,}'
分开,将字符串拆分为2个或更多空格,然后可以起诉set()
以保留唯一的项目。
注意:如果您关心订单,可以使用collections.OrderedDict
代替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'
答案 1 :(得分:2)
如果你不介意丢失标点符号:
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
如果您有重复的单词,您将无法使用该方法,但根据您的输入,无法知道可能的组合是什么,第二条线实际上始终完好无损,在这种情况下,您将只是需要拉第二行。