python - 如果列表元素在两个空格之间,则联接它们




list join (5)

我有这样的输入:

['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']

我想在 '' 之间加入元素以产生如下输出:

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

我尝试使用像这样的 join 和列表切片:

a=['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
a[2:5] = [''.join(a[ 2: 5])]
a=['assembly', '', 'python', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']

这在某种程度上可行,但是我不知道如何遍历整个列表。


你可以这样做:

a = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
indx = ['' == k for k in a]
indx = [i for i, x in enumerate(indx) if x] # get the indices.
a_merged = a[0:indx[0]] + [''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1] + a[indx[-1]+1:] # merge the list

输出:

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

评论后编辑:

a = ['assembly', '','',  'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
indx = [i for i, x in enumerate(a) if x == ''] # get the indices where '' occurs in the original list. 
a_merged = a[0:indx[0]] + [''.join(a[indx[i]:indx[i+1]]) for i in range(len(indx)) if i < len(indx)-1 and indx[i+1] -indx[i] > 1] + a[indx[-1]+1:]
a_merged

输出:

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

使用 itertools.groupby

from itertools import groupby

l = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
new_l = [''.join(g) for k, g in groupby(l, key = bool) if k]

输出:

['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

如果您不能或不想使用itertools:

l = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
l_new = []
combined = ""
for idx, s in enumerate(l):
    if s != "":
        combined += s
        if idx == len(l)-1:
            l_new.append(combined)

    else:
        l_new.append(combined)
        combined = ""

如果输入分隔符实际上是空字符串,则可以执行

strlist = [x or ' ' for x in a]
joined = ''.join(strlist).split()
joined
['assembly', 'python', 'java', 'ruby', 'javascript', 'c++']

这太糟糕了,但是

lambda b:lambda l:''.join(i or b for i in l).split(b)

可以接受可以保证列表的串联中不包含的任何字符串,并返回执行所需功能的函数。 当然,对于您的特定情况,您可能只想使用一次或两次,因此,如果可以保证列表中的任何元素都不包含空格,则它看起来可能更像:

a = ['assembly', '', 'py', 'tho', 'n', '', 'ja', 'va', '', 'rub', 'y', '', 'java', 'script', '', 'c++']
a = ''.join(i or ' ' for i in a).split(' ')




whitespace