如何用python列表中的多个列表项替换文本分隔的字符串列表项?

时间:2017-08-02 15:57:42

标签: python

给出一个清单:

mylist = ['dog', 'cat', 'mouse_bear', 'lion_tiger_rabbit', 'ant']

我想要一个单行代码来返回一个新列表:

['dog', 'cat', 'mouse', 'bear', 'lion', 'tiger', 'rabbit', 'ant']

12 个答案:

答案 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('_')