按特定索引合并python列表



我有一个数组,我希望在其中合并一个特定的索引。

["captain:", "robot", "alpha", "beta:", "gama", "delta:", "fighter", "test", "exp"]

这个想法,每个偶数元素都应该包含:而其他元素不应该包含:

我想要的输出:

["captain:", "robot, alpha", "beta:", "gama", "delta:", "fighter, test, exp"]

例如,考虑到阵列是可变的,阵列可以是:

["captain:", "robot", "beta:", "game", "exp", "delta:", "fighter", "test"]

输出应该是相同的,每个偶数带:和奇数索引不带:

有人能帮忙吗?

下面是一个使用groupby:的实现

import itertools
x = ["captain:", "robot", "alpha", "beta:", "gama", "delta:", "fighter", "test", "exp"]
new_list = []
for key, group in itertools.groupby(x, key = lambda string: string.endswith(':')):
if key: # in case you happen to consecutive values that end in a colon
new_list += list(group)
else: # these elements do not end in a colon
new_list.append(', '.join(group))
print(new_list)
# ['captain:', 'robot, alpha', 'beta:', 'gama', 'delta:', 'fighter, test, exp']

这里,分组关键字检查项目是否以":"结束,如果是,则keyTrue,否则为False。如果key的连续值相同,则将它们放在同一组中。因此,包含冒号的字符串后面的任何数量的元素都将被分组在一起。

itertools.groupby()已经为您介绍了。

lst = ["captain:", "robot", "alpha", "beta:", "gama", "delta:", "fighter", "test", "exp"]
print([', '.join(g[1]) for g in itertools.groupby(lst, lambda s: s.endswith(':'))]) 
# ['captain:', 'robot, alpha', 'beta:', 'gama', 'delta:', 'fighter, test, exp']

我不知道groupby函数。因此,如果有人感兴趣,这里有一种替代方法:

sample = ["captain:", "robot", "alpha", "beta:", "gama", "delta:", "fighter", "test", "exp"]

def find_next_index(sample, start):
for i in range(len(sample)):
if i>start and ":" in sample[i]:
return i, ", ".join(sample[start+1:i]), False

return start, ", ".join(sample[start+1:]), True

result = []
start = 0
while True:
x,y,z = find_next_index(sample, start)
result.append(sample[start])
result.append(y)
start = x
if z:
break

print(result)

输出:

['captain:', 'robot, alpha', 'beta:', 'gama', 'delta:', 'fighter, test, exp']

最新更新