В python удаление тысяч запятой из чисел в списке, где числа разделены запятыми - PullRequest
1 голос
/ 06 июля 2011

У меня есть список данных, аналогичный приведенному ниже:

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

Я хочу, чтобы эти данные были в форме, аналогичной приведенной ниже:

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

Я не уверен, как поступить. Я подумал, возможно, удалив все запятые, затем вставляя запятые только там, где они должны быть, а затем удаляя цитаты. Я считаю, что это довольно сложно.

Спасибо

Ответы [ 5 ]

4 голосов
/ 06 июля 2011

Я предполагаю, что эти данные изначально были в 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 голос
/ 06 июля 2011

Если исходными данными является 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']

Парный фрагмент отсюда: Итерация по всем двум элементам в списке

0 голосов
/ 06 июля 2011

Уменьшите на помощь:

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), но также предполагает, что все число было заключено в двойные кавычки.

Как уже говорили другие, вам следует вернуться к поиску данных, так как есть наиболее вероятные способы получить значения правильно, не обращаясь к двойным кавычкам. Тем не менее, это была небольшая забавная задача.

0 голосов
/ 06 июля 2011

Ваши данные выглядят примерно так:

«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*)?)"')
0 голосов
/ 06 июля 2011

Если у вас никогда не будет непревзойденной пары, обведите в диапазоне 1/2 размера входного списка, объедините текущий индекс и следующий вместе, сделайте подстановку строки и перейдите к текущему индексу плюс два.

...