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