我有一个类似于下面的数据列表:
a = ['"105', '424"', '"102', '629"', '"104', '307"']
我希望这些数据采用类似于以下的形式:
a = ['105424', '102629', '104307']
我不确定如何进行。我想也许删除所有的逗号,然后只在它们应该插入的地方插入逗号,然后删除引号。我发现这很有挑战性。
谢谢
我假设此数据最初位于 csv 文件中,其中引用了包含逗号的数据(“105,424”、“102,629”、“104,307”),然后您使用逗号进行拆分:
>>> '"105,424","102,629","104,307"'.split(',')
['"105', '424"', '"102', '629"', '"104', '307"']
相反,您应该让csv
模块完成工作,因为它将处理双引号:
import csv
with open('u:\\foobar.csv', 'rb') as f:
reader = csv.reader(f)
for row in reader:
print [x.replace(',','') for x in row]
这打印:['105424', '102629', '104307']
如果源数据是 CSV,您应该使用@steven 的答案。
无论如何,这里是你如何处理你粘贴的内容。
正如@troutwine 所说,这只有在数字部分总是成对的情况下才有效。
a = ['"105', '424"', '"102', '629"', '"104', '307"']
from itertools import izip
def pairwise(iterable):
"s -> (s0,s1), (s2,s3), (s4, s5), ..."
a = iter(iterable)
return izip(a, a)
result = []
for x, y in pairwise(a):
result.append(''.join([x, y]).strip('"'))
print result
给出:
['105424', '102629', '104307']
此处的成对片段:迭代列表中的每两个元素
如果您永远不会有不匹配的对,请在输入列表大小的 1/2 范围内循环,将当前索引和下一个索引混合在一起,进行字符串替换并跳到当前索引加 2。
减少救援:
l = ['"105', '424"', '"102', '629"', '"104', '307"', '"123', '456', '789"', '"123"']
# Concatenate everything and split by ", get non-empties
l2 = [num for num in reduce(lambda x, y: x+y, l).split('"') if num != '']
# Output:
# ['105424', '102629', '104307', '123456789', '123']
print l2
但有几点需要注意:此代码可以处理超过数千的数字(即 1,457,664),但也假定整数是双引号。
正如其他人所说,您应该重新访问您的数据检索,因为最有可能的方法是在不处理双引号的情况下正确获取值。尽管如此,这还是一个有趣的小挑战。
您的数据是否类似于:
“123”、“123,456”、“123,456,789”
如果是这样,那么试试这个
input = '"123", "123,456", "123,456,789"'
import re
reg = re.compile('"(\d{1,3}(,\d{3})*)"')
stringValues = [wholematch.replace(',', '') for wholematch, _endmatch
in reg.findall(input)]
这个正则表达式也应该适用于带有小数位的千位。
re.compile('"(\d{1,3}(,\d{3})*(\.\d*)?)"')