1

我有一个类似于下面的数据列表:

a = ['"105', '424"', '"102', '629"', '"104', '307"']

我希望这些数据采用类似于以下的形式:

a = ['105424', '102629', '104307']

我不确定如何进行。我想也许删除所有的逗号,然后只在它们应该插入的地方插入逗号,然后删除引号。我发现这很有挑战性。

谢谢

4

5 回答 5

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

于 2011-07-05T22:11:15.073 回答
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']

此处的成对片段:迭代列表中的每两个元素

于 2011-07-05T21:55:54.173 回答
0

如果您永远不会有不匹配的对,请在输入列表大小的 1/2 范围内循环,将当前索引和下一个索引混合在一起,进行字符串替换并跳到当前索引加 2。

于 2011-07-05T21:50:55.650 回答
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),但也假定整数是双引号。

正如其他人所说,您应该重新访问您的数据检索,因为最有可能的方法是在不处理双引号的情况下正确获取值。尽管如此,这还是一个有趣的小挑战。

于 2011-07-05T22:18:31.823 回答
-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*)?)"')
于 2011-07-05T22:14:13.797 回答