在python中有选择地转换列表项

时间:2016-07-25 19:58:34

标签: python

所以我有一个Python列表,其中所有项目都应该是数字,除非列表有三个项目。在这种情况下,最后一项应该保留一个我从字符串转换的字符串。代码如下:

special_ops = [6]
program = [ line for line in temp.split(";") ]
for i in range(len(program)):
    line = [ int(p) for p in program[i].split(",")[:2] ]
    if ( line[0] in special_ops ):
        line.append( program[i].split(",")[2] )
    program[i] = line

预解析字符串的结构如下所示:

0,1;2,1;2,0;3,2;6,1,a string

这对我来说似乎不是Pythonic所以我希望这个代码更简洁。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

>>> a = [x.split(',') for x in temp.split(';')]
>>> [[int(x) for x in lst] if len(lst)==2 else [int(lst[0]), int(lst[1]), lst[2]] for lst in a]
[[0, 1], [2, 1], [2, 0], [3, 2], [6, 1, 'a string']]

如何运作

第一个语句只是在一个方便的字符串列表列表中拆分temp:

>>> a = [x.split(',') for x in temp.split(';')]
>>> a
[['0', '1'], ['2', '1'], ['2', '0'], ['3', '2'], ['6', '1', 'a string']]

第二个命令使用三元语句来处理长度为2的列表与长度为3的列表不同。只看三元部分:

>>> lst = ['0', '1']
>>> [int(x) for x in lst] if len(lst)==2 else [int(lst[0]), int(lst[1]), lst[2]]
[0, 1]

>>> lst = [6, 1, 'a string']
>>> [int(x) for x in lst] if len(lst)==2 else [int(lst[0]), int(lst[1]), lst[2]]
[6, 1, 'a string']

全部作为一个命令

如果想要避开中间变量,那么上面的两个命令可以合并为一个:

>>> [[int(x) for x in lst] if len(lst)==2 else [int(lst[0]), int(lst[1]), lst[2]] for lst in [x.split(',') for x in temp.split(';')]]
[[0, 1], [2, 1], [2, 0], [3, 2], [6, 1, 'a string']]