代码之家  ›  专栏  ›  技术社区  ›  Juuso Uu

元组合并列表

  •  -5
  • Juuso Uu  · 技术社区  · 2 年前

    我在处理其中的元组列表时遇到问题。

    如果我有一个元组列表,如下所示:

    list = [('1', 'a'), ('2', 'b'), ('3', 'c'), ('3', 'd'), ('4', 'e'), ('4', 'f'), ('5', 'g')]
    

    但我想把它格式化成这样,每个数字中只有一个,后面有一个字母列表,而不是它们都是分开的:

    list = [('1', ['a']), ('2', ['b']), ('3', ['c', 'd']), ('4', ['e', 'f']), ('5', ['g'])]
    

    会采取什么方法?

    3 回复  |  直到 2 年前
        1
  •  1
  •   Andrej Kesely    2 年前

    创建一个分组字典,其中键是元组中的第一个值,值是列表。然后,您可以将此词典转换为最终列表:

    lst = [
        ("1", "a"),
        ("2", "b"),
        ("3", "c"),
        ("3", "d"),
        ("4", "e"),
        ("4", "f"),
        ("5", "g"),
    ]
    
    out = {}
    for a, b in lst:
        out.setdefault(a, []).append(b)
    
    out = list(out.items())
    print(out)
    

    打印:

    [('1', ['a']), ('2', ['b']), ('3', ['c', 'd']), ('4', ['e', 'f']), ('5', ['g'])]
    
        2
  •  1
  •   chepner    2 年前

    这是由完成的操作 itertools.groupby 。一个简单的例子,假设您的列表已经正确排序,看起来像

    >>> from itertools import groupby
    >>> L = [('1', 'a'), ('2', 'b'), ('3', 'c'), ('3', 'd'), ('4', 'e'), ('4', 'f'), ('5', 'g')]
    >>> [(k, [x for _, x in v]) for k, v in groupby(L, key=lambda x: x[0])]
    [('1', ['a']), ('2', ['b']), ('3', ['c', 'd']), ('4', ['e', 'f']), ('5', ['g'])]
    

    的结果 groupby 是键的映射(由 key 参数)分配给共享每个键的列表中的对象。 [x for _, x in v] 提取原始元组的非关键部分。

        3
  •  1
  •   Kanak    2 年前

    以下是实现所需输出的另一种方法

    lst = [('1', 'a'), ('2', 'b'), ('3', 'c'), ('3', 'd'), ('4', 'e'), ('4', 'f'), ('5', 'g')]
    
    result = {}
    
    for number, letter in lst:
        if number not in result:
            result[number] = [letter]
        else:
            result[number].append(letter)
    
    result_list = list(result.items())
    
    print(result_list)
    
    1. 创建空字典(结果)
    2. 如果字典中还没有数字,它会初始化一个空列表并添加当前字母。如果数字已经存在,它会将字母附加到现有列表中。
    3. 最后将结果字典转换为元组