【问题标题】:Merge python list by specific indexes按特定索引合并python列表
【发布时间】:2022-01-16 21:27:47
【问题描述】:

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

["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"]

输出应该是相同的,每个偶数都有 : 和奇数索引没有 :

有人可以帮忙吗?

【问题讨论】:

  • 有什么努力吗?代码?
  • @OlvinR​​oght 我唯一能想到的就是找到索引,例如,用 : 找到元素的索引并检查它们之间的元素索引并合并它们,但我无法到目前为止实现这一点:(
  • 您可以从检索包含尾随冒号的元素的索引开始。 str.endswith() 可能会有所帮助。
  • 是的,我也可以使用if ':' in array,但再次不确定如何在没有冒号的情况下合并它们。

标签: python list


【解决方案1】:

这是一个使用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 的连续值相同,则将它们放在同一组中。因此,包含冒号的字符串后面的任意数量的元素都将被组合在一起。

【讨论】:

    【解决方案2】:

    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']
    

    【讨论】:

    • 我会使用for _, g (imho)
    • @OlvinR​​oght 通过这样做,我们也将 g[1] 更改为 g。对于 _, g 是否将 groupby 中的元素解包为返回元组中的单个元素?我现在正在阅读 groupby 文档,但我无法理解为什么他们不只返回 grouper 迭代器
    • @RichardKYu,我认为这很明显。 groupby() 返回对,其中第一个元素是键,第二个元素是迭代器,所有元素都按此键分组。虽然在这种特殊情况下我们不需要它,但在许多情况下 key 是必需的,尤其是当您在作为 key 参数传递的函数中执行一些数据修改并希望使用修改后的数据时。
    【解决方案3】:

    我不知道 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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2016-09-20
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多