如何在Python中以特定方式重组列表

时间:2018-08-01 13:15:01

标签: python list list-manipulation

所以,我要尝试的是如果您具有以下列表:

example_list=['This', 'is', 'QQQQQ', 'an', 'QQQQQ', 'example', 'list', 'QQQQQ', '.']

我希望将其重组为:

example_list=['This is', 'an', 'example list', '.']

请注意如何将QQQQQ用作占位符。因此,基本上,我希望QQQQQ之间的所有内容都成为一个列表元素。我该怎么办?

我还看过其他有关join()函数的文章,但是我遇到的问题是,如果有多个单词,请在两者之间加一个空格。

4 个答案:

答案 0 :(得分:4)

使用简单的迭代。

例如:

example_list=['This', 'is', 'QQQQQ', 'an', 'QQQQQ', 'example', 'list', 'QQQQQ', '.']

res = [[]]
for i in example_list:
    if i == "QQQQQ":
        res.append([])
    else:
        res[-1].append(i)
print([" ".join(i) for i in res])

输出:

['This is', 'an', 'example list', '.']

答案 1 :(得分:2)

您可以使用itertools.groupby()

>>> from itertools import groupby
>>> example_list=['This', 'is', 'QQQQQ', 'an', 'QQQQQ', 'example', 'list', 'QQQQQ', '.']
>>> [' '.join(g) for k, g in groupby(example_list, lambda x: x == 'QQQQQ') if not k]
['This is', 'an', 'example list', '.']

或者甚至.__eq__(如@tobias_k在评论中建议的那样:

>>> [' '.join(g) for k, g in groupby(example_list, key='QQQQQ'.__eq__) if not k]
['This is', 'an', 'example list', '.']

答案 2 :(得分:2)

尝试将joinstrip()一起使用以消除空格

answer = [s.strip() for s in ' '.join(map(str, example_list)).split('QQQQQ')]
print (answer)

输出

['This is', 'an', 'example list', '.']

答案 3 :(得分:2)

简单的解决方案:先进行空格连接,然后在拆分函数中将空格添加到占位符。

示例:

example_list = ['This', 'is', 'QQQQQ', 'an', 'QQQQQ', 'example', 'list', 'QQQQQ', '.']

print(' '.join(example_list).split(' QQQQQ '))

结果:

['This is', 'an', 'example list', '.']

或更笼统:

split_arg = ' {} '.format(place_holder)
example_list = ' '.join(example_list).split(split_arg)

由tobias_k评论后编辑

评论是:“当然,只有占位符实际上是字符串,并且该stuntng没有出现在任何其他词中时,此方法才起作用。即,如果占位符为例如None,' Q'或“ – – tobias_k”

这是对的,所以我提出了一个更通用的解决方案,使其适用于每个占位符。

import random
import string

example_list = ['This', 'is', None, 'an', None, 'example', 'list', None, '.']
place_holder = None
# create a random string of length 10
random_place_holder = ''.join(random.choices(string.ascii_uppercase + string.digits, k=10))  
# Replace all old place holders with our new random string placeholder
example_list = [x if x != place_holder else random_place_holder for x in example_list ]
split_arg = ' {} '.format(random_place_holder)
example_list = ' '.join(example_list).split(split_arg)
print(example_list)

说实话,如果您有不方便的占位符(例如tobias_k提到的),则最好使用其他任何解决方案。

决定计时: 二手:

example_list = ['This', 'is', None, 'an', None, 'example', 'list', None, '.'] * 10000
place_holder = None

我使用了更长的列表,因此创建随机字符串并不是一个很费时的部分,而且无论如何您都不使用大列表时,时间安排很愚蠢。

此解决方案: 每个循环11.6 ms±153 µs(平均±标准偏差,共运行7次,每个循环100个循环)

Rakesh循环解决方案: 每个循环25.8 ms±819 µs(平均±标准偏差,共运行7次,每个循环10个循环)

RoadRunner的分组依据: 每个循环34.4 ms±1.21 ms(平均±标准偏差,共运行7次,每个循环10个循环)