Python:无法在列表中转换“None”或空字符串值

时间:2016-11-15 22:37:19

标签: python list

我有一个名为query1的列表:

[['PD', '', '', '', None, None, None, Decimal('43194'), Decimal('0'), Decimal('1000'), Decimal('500'), Decimal('67300'), Decimal('500'), Decimal('24426'), Decimal('2400'), Decimal('109700'), Decimal('1895'), Decimal('34000'), Decimal('100000'), None, None, Decimal('7900'), Decimal('1594'), None, None, Decimal('45900'), Decimal('12500'), None, Decimal('430'), Decimal('4550'), None, Decimal('11000'), Decimal('33700'), None, Decimal('10100'), Decimal('13500'), None, None, None, Decimal('96282'), Decimal('1000'), Decimal('2450'), Decimal('3700'), Decimal('19657'), Decimal('190700'), Decimal('7200'), Decimal('0'), Decimal('34650'), None, None, Decimal('1070'), None, Decimal('23200'), Decimal('200'), None, None, Decimal('42200'), Decimal('0'), Decimal('2000'), Decimal('7058'), None, Decimal('0'), None, None, None, Decimal('39900'), None, Decimal('21250'), Decimal('500'), Decimal('2000'), None, Decimal('4000'), Decimal('0'), Decimal('21900'), Decimal('349950'), Decimal('1200'), None], ['VE', '', '', '', None, None, None, Decimal('20700'), Decimal('0'), None, None, Decimal('65000'), Decimal('9300'), Decimal('8920'), Decimal('200'), Decimal('26500'), Decimal('2000'), Decimal('10850'), Decimal('73000'), None, None, Decimal('3000'), None, None, None, Decimal('11700'), Decimal('6000'), None, None, None, None, Decimal('500'), Decimal('300'), None, Decimal('1000'), Decimal('20000'), None, None, None, Decimal('7000'), None, Decimal('0'), Decimal('26500'), Decimal('5300'), Decimal('7000'), Decimal('3500'), None, Decimal('15000'), None, None, None, None, Decimal('13000'), Decimal('1000'), None, None, Decimal('19400'), Decimal('0'), None, Decimal('9900'), None, None, None, None, None, Decimal('32000'), None, Decimal('3000'), None, None, None, Decimal('3000'), Decimal('0'), Decimal('2000'), Decimal('18300'), None, None]]

我想将所有None和''值更改为零,但是当我尝试这段代码时:

    for i in range(len(query1)):
        for j in range(1, len(query1)):
            try:
                int(query1[i][j]) > 0
            except ValueError:
                query1[i][j] = 0

    print(query1)

这是我得到的结果:

[['PD', 0, '', '', None, None, None, Decimal('43194'), Decimal('0'), Decimal('1000'), Decimal('500'), Decimal('67300'), Decimal('500'), Decimal('24426'), Decimal('2400'), Decimal('109700'), Decimal('1895'), Decimal('34000'), Decimal('100000'), None, None, Decimal('7900'), Decimal('1594'), None, None, Decimal('45900'), Decimal('12500'), None, Decimal('430'), Decimal('4550'), None, Decimal('11000'), Decimal('33700'), None, Decimal('10100'), Decimal('13500'), None, None, None, Decimal('96282'), Decimal('1000'), Decimal('2450'), Decimal('3700'), Decimal('19657'), Decimal('190700'), Decimal('7200'), Decimal('0'), Decimal('34650'), None, None, Decimal('1070'), None, Decimal('23200'), Decimal('200'), None, None, Decimal('42200'), Decimal('0'), Decimal('2000'), Decimal('7058'), None, Decimal('0'), None, None, None, Decimal('39900'), None, Decimal('21250'), Decimal('500'), Decimal('2000'), None, Decimal('4000'), Decimal('0'), Decimal('21900'), Decimal('349950'), Decimal('1200'), None], ['VE', 0, '', '', None, None, None, Decimal('20700'), Decimal('0'), None, None, Decimal('65000'), Decimal('9300'), Decimal('8920'), Decimal('200'), Decimal('26500'), Decimal('2000'), Decimal('10850'), Decimal('73000'), None, None, Decimal('3000'), None, None, None, Decimal('11700'), Decimal('6000'), None, None, None, None, Decimal('500'), Decimal('300'), None, Decimal('1000'), Decimal('20000'), None, None, None, Decimal('7000'), None, Decimal('0'), Decimal('26500'), Decimal('5300'), Decimal('7000'), Decimal('3500'), None, Decimal('15000'), None, None, None, None, Decimal('13000'), Decimal('1000'), None, None, Decimal('19400'), Decimal('0'), None, Decimal('9900'), None, None, None, None, None, Decimal('32000'), None, Decimal('3000'), None, None, None, Decimal('3000'), Decimal('0'), Decimal('2000'), Decimal('18300'), None, None]]

我也尝试过:

    for i in range(len(query1)):
        for j in range(1, len(query1)):
            if query1[i][j] is None or query[i][j] == 'None' or type(query[i][j]) is None or query1[i][j] == '':
                query[i][j] = 0
            else:
                query[i][j] = int(str(query[i][j]))

结果完全一样。关于我做错了什么想法?

4 个答案:

答案 0 :(得分:2)

您可以在此处使用嵌套的列表理解。假设您的列表存储在变量my_list中,请执行

my_list = [[0 if item in [None, ''] else item for item in sub_list] for sub_list in my_list]

如果可以Decimal('0'),而不是0。你可能会这样做:

my_list = [[item or Decimal('0') for item in sub_list] for sub_list in my_list]

答案 1 :(得分:2)

您的代码问题出在第二行。你循环遍历主列表。

将其更改为:

for j in range(1, len(query1[i])):

它应该有效。最好用简单的if语句检查值:

if query[i][j] in (None, ''):
    query[i][j] = 0

你也可以使用列表理解,但它更高级,你需要一些时间来适应它。

答案 2 :(得分:2)

列表中有一个列表,因此您必须遍历这两个列表:

new_list = [] 
for outer_list_item in query1:
    temp_list = [] 
    for inner_list_item in outer_list_item:
        if inner_list_item in (None, ''):
            temp_list.append(0)
        else:
            temp_list.append(inner_list_item) 
    new_list.append(temp_list)

答案 3 :(得分:1)

因此,从列表中删除空值(无,''等)的最Pythonic方法是过滤它:

test_list = ['something', None, '', False, 25, [1,2,3,4], (2,3)]
filtered_list = filter(None, test_list)
print filtered_list

['something', 25, [1, 2, 3, 4], (2, 3)]

如果你有一个列表列表,你可以在一个for循环中使用过滤器(或使用一个理解列表)