2016-11-15 38 views
0

我有这个名单称为QUERY1:的Python:不能将“无”或空字符串值列表

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

而且我想改变这一切的无和'值零,但是当我试试这个代码:

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

,结果是完全一样的。关于我在做什么的任何想法都是错误的?

+0

太多的数据。将其减少到显示问题的最小子集 – njzk2

+1

看起来像你陷入了让代码不必要的复杂。此外,作为一般规则,如果你发现自己使用'因为我在范围内(LEN(X)):',你的代码可能会是更清洁,如果你将其替换为'因为我在枚举ELEM(X):' – Jeff

回答

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

'如果item else'可以简单地'或'。而且你的变量名称有拼写错误。 – TigerhawkT3

+1

另请注意,这会将'Decimal('0')'更改为'0'。 – TigerhawkT3

+1

而且它不完全正确,因为Decimal('0')的计算结果为False。只要项目是无或项目是'' –

2

你的代码的问题在第二行。你正在循环主列表的长度。

将其更改为:

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

,它应该工作。此外,最好用简单的if语句来检查值:

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

您还可以使用列表理解,但它更先进,它会带你一段时间去适应它。

+0

哦,我,我怎么会没有注意到?谢谢你这么多 – Nadni

+0

你打我吧:)为什么不只是'范围(LEN(QUERY1 [1])'虽然? –

+1

@JulienMarrec我认为这是有意完成的,因为第一个元素是一些'PD'国家代码标签。当然,如果你愿意,你可以从开始循环。 –

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) 
+0

这将因为您正在设置项目而不更改列表而工作。 –

1

所以,最Python化的方式来删除列表为空值(无“”等)被过滤它:

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循环(或者使用一个理解列表)

相关问题