我有一个数组,我希望在其中合并一个特定的索引。
["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']
这里,分组关键字检查项目是否以":"
结束,如果是,则key
为True
,否则为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']