我有一个类似于以下数据的列表:
a = ['"105', '424"', '"102', '629"', '"104', '307"']
我希望这些数据的形式类似于以下形式:
a = ['105424', '102629', '104307']
我不确定如何继续。我想也许删除所有的逗号然后只在它们应该的位置插入逗号然后删除引号。我发现这很有挑战性。
由于
答案 0 :(得分:4)
我假设这个数据最初是在一个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']
答案 1 :(得分:1)
如果源数据是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']
来自此处的成对代码段:Iterating over every two elements in a list
答案 2 :(得分:0)
如果你永远不会有一个不匹配的对,循环超过输入列表大小1/2的范围,将当前索引加上下一个进行混合,做一个字符串替换并跳到当前索引再加上两个。 / p>
答案 3 :(得分:0)
减少救援:
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),但也假设整数是双引号。
正如其他人所说,你应该重新审视你的数据检索,因为最有可能的方法是在不处理双引号的情况下正确获取值。尽管如此,这仍是一个有趣的小挑战。
答案 4 :(得分:-1)
您的数据是否类似于:
“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*)?)"')