所以我有一个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所以我希望这个代码更简洁。任何帮助将不胜感激。
答案 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']]