给出一个清单:
mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']
我想要一个单行代码来返回一个新列表:
['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
答案 0 :(得分:12)
另一个技巧是首先使用下划线加入列表,然后重新拆分:
"_".join(mylist).split('_')
答案 1 :(得分:6)
在你的理解中使用2 for
个句子,例如:
>>> mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']
>>> [animal for word in mylist for animal in word.split('_')]
['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
答案 2 :(得分:4)
这不是一个单行,但如果你想要返回一个发电机,它仍然是一个有效的选择:
def yield_underscore_split(lst):
for x in lst:
yield from x.split('_')
>>> list(yield_underscore_split(mylist))
['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
原始答案仅适用于Python 3.3-3.7版本,此处保留给感兴趣的读者。不要使用!
>>> list([(yield from x.split('_')) for x in l])
['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
答案 3 :(得分:3)
使用itertools
recipe展平列表,您可以执行此操作:
from itertools import chain
mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']
new_list = list(chain.from_iterable(item.split('_') for item in mylist))
print(new_list)
# ['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
...或者导入声明是否违反了您的单行要求?
答案 4 :(得分:3)
由于这里发布了很多答案(超过十个),我认为显示一些时间统计数据来比较所发布的不同方法是有益的:
System.out.println(myMain.toString());
以下是我用来测试的脚本:
-----------------------------------------
AChampion time: 2.6322
-----------------------------------------
hiro_protagonist time: 3.1724
-----------------------------------------
Eugene_Sh time: 1.0108
-----------------------------------------
cᴏʟᴅsᴘᴇᴇᴅ time: 3.5386
-----------------------------------------
jdehesa time: 2.9406
-----------------------------------------
mogga time: 3.1645
-----------------------------------------
Ajax1234 time: 2.4659
-----------------------------------------
针对问题中给出的样本列表测试每种方法大约一百万次。为了保持可读性,每个时间结果都四舍五入到小数点后四位。
注意:如果您还有一个尚未在此处发布的新唯一方法,请在评论中与我联系,我会尝试为它也是。
答案 5 :(得分:1)
将每个项目拆分为子列表并展平它们:
[item for sublist in mylist for item in sublist.split("_")]
答案 6 :(得分:1)
单线被高估。这是使用“传统” for
循环的解决方案。
mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']
out = []
for s in mylist:
if '_' in s:
out.extend(s.split('_'))
else:
out.append(s)
print(out)
输出
['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
这也有效:
out = []
for s in mylist:
out.extend(s.split('_'))
它更短,但是我认为以前的版本更清晰。
答案 7 :(得分:0)
你可以这样做:
mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']
result = sum((s.split("_") for s in mylist), [])
print(result)
>>> ['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
答案 8 :(得分:0)
这有效:
[i for sublist in [j.split('_') for j in mylist] for i in sublist]
答案 9 :(得分:0)
你可以试试这个:
from itertools import chain
mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']
new_list = list(chain(*[[i] if "_" not in i else i.split("_") for i in mylist]))
输出:
['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']
答案 10 :(得分:0)
mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']
animals = [a for item in mylist for a in item.split('_')]
print (animals)
答案 11 :(得分:-1)
我实际上会做什么:
newlist = []
for i in mylist:
newlist += i.split('_')