可能重复:
将元组列表转换为列表?
我有这样的清单
[('Knightriders',), ('The Black Knight',), ('Fly by Knight',), ('An Arabian Knight',), ('A Bold, Bad Knight',)...]
Run Code Online (Sandbox Code Playgroud)
我想将其转换为:
['Knightriders', 'The Black Knight', 'Fly by Knight', 'An Arabian Knight', 'A Bold, Bad Knight',...]
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最耗时的方法是什么?
最简单的是使用列表理解:
In [126]: lis=[('Knightriders',), ('The Black Knight',), ('Fly by Knight',), ('An Arabian Knight',), ('A Bold, Bad Knight',)]
In [127]: [x[0] for x in lis]
Out[127]:
['Knightriders',
'The Black Knight',
'Fly by Knight',
'An Arabian Knight',
'A Bold, Bad Knight']
Run Code Online (Sandbox Code Playgroud)
或使用itemgetter
:
In [128]: from operator import itemgetter
In [129]: list(map(itemgetter(0),lis))
Out[129]:
['Knightriders',
'The Black Knight',
'Fly by Knight',
'An Arabian Knight',
'A Bold, Bad Knight']
Run Code Online (Sandbox Code Playgroud)
要么:
In [131]: [next(x) for x in map(iter,lis)]
Out[131]:
['Knightriders',
'The Black Knight',
'Fly by Knight',
'An Arabian Knight',
'A Bold, Bad Knight']
Run Code Online (Sandbox Code Playgroud)
或者zip()
按照@DSM的建议使用:
In [132]: zip(*lis)[0]
Out[132]:
('Knightriders',
'The Black Knight',
'Fly by Knight',
'An Arabian Knight',
'A Bold, Bad Knight')
Run Code Online (Sandbox Code Playgroud)
或使用ast.literal_eval
(最不推荐的解决方案或可能永远不会尝试这个):
In [148]: from ast import literal_eval
In [149]: literal_eval(repr(lis).replace(",)",")"))
Out[149]:
['Knightriders',
'The Black Knight',
'Fly by Knight',
'An Arabian Knight',
'A Bold, Bad Knight']
Run Code Online (Sandbox Code Playgroud)