代码之家  ›  专栏  ›  技术社区  ›  Karma

将列表转换为元组列表,每个元组中都有重复的项值

  •  2
  • Karma  · 技术社区  · 7 年前

    我有几个N维数组,如下所示。如何将这些数组转换为元组?

    num = ['1' '2']
    letter1 = ['a' 'b' 'c' 'd' 'e' 'f']
    letter2 = ['aa' 'bb' 'cc' 'dd' 'ee' 'ff']
    

    我想要的结果是:

    tuple1 = [(1,a),(1,b),(1,c),(1,d),(1,e),(1,f)]
    tuple2 = [(2,aa),(2,bb),(2,cc),(2,dd),(2,ee),(2,ff)]
    

    我有

    tuple1 = tuple(num[0], letter1)
    tuple2 = tuple(num[1], letter2)
    

    但我有个错误 TypeError: tuple() takes at most 1 argument (2 given)

    你的方法是什么?任何方法都将不胜感激。谢谢

    4 回复  |  直到 7 年前
        1
  •  6
  •   Moinuddin Quadri    7 年前

    您可以使用 zip 具有 itertools.repeat 要实现这一点,请执行以下操作:

    >>> from itertools import repeat
    >>> num = ['1', '2']
    >>> letter1 = ['a', 'b', 'c', 'd', 'e', 'f']
    
    >>> tuple1 = list(zip(repeat(num[0]), letter1))
    >>> tuple1
    [('1', 'a'), ('1', 'b'), ('1', 'c'), ('1', 'd'), ('1', 'e'), ('1', 'f')]
    

    PS: 注意逗号 , 在上述列表中的元素之间。不带逗号分隔的字符串被视为单个字符串。


    受上述答案启发,以下是 列表理解 要获取的解决方案版本 tuple1 tuple2 一气呵成:

    letter2 = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff'] # rest of the variables same as the above solution
    
    tuple1, tuple2 = [list(zip(repeat(a), b)) for a, b in zip(num, (letter1, letter2))]
    

    其中,这些变量将以下列表作为值保存:

    >>> tuple1
    [('1', 'a'), ('1', 'b'), ('1', 'c'), ('1', 'd'), ('1', 'e'), ('1', 'f')]
    >>> tuple2
    [('2', 'aa'), ('2', 'bb'), ('2', 'cc'), ('2', 'dd'), ('2', 'ee'), ('2', 'ff')]
    
        2
  •  2
  •   Ajax1234    7 年前

    您可以使用 iter next :

    num = ['1', '2']
    num = iter(num)
    letter1 = ['a', 'b', 'c', 'd', 'e', 'f']
    letter2 = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
    tuple1, tuple2 = [list(zip(i, [next(num)]*len(i))) for i in [letter1, letter2]]
    

    输出:

    [('a', '1'), ('b', '1'), ('c', '1'), ('d', '1'), ('e', '1'), ('f', '1')]
    [('aa', '2'), ('bb', '2'), ('cc', '2'), ('dd', '2'), ('ee', '2'), ('ff', '2')]
    

    没有 iter :

    tuple1, tuple2 = [[(i, h) for i in c] for c, h in zip([letter1, letter2], ['1', '2'])]
    
        3
  •  1
  •   sjw    7 年前

    已经有一些不错的答案了,但我将使用列表理解分享另一个答案。它看起来更像一段代码,但适用于更长的 nums lists (只要它们的长度仍然相同):

    letter1 = ['a', 'b', 'c', 'd', 'e', 'f']
    letter2 = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff']
    nums = [1, 2]
    
    lists = [letter1, letter2]
    tuples = [[(i, x) for x in l] for i, l in zip(nums, lists)]
    
    tuple1, tuple2 = tuples
    

    结果:

    In [1]: tuple1
    Out[1]: [(1, 'a'), (1, 'b'), (1, 'c'), (1, 'd'), (1, 'e'), (1, 'f')]
    
    In [2]: tuple2
    Out[2]: [(2, 'aa'), (2, 'bb'), (2, 'cc'), (2, 'dd'), (2, 'ee'), (2, 'ff')]
    
        4
  •  1
  •   Aaditya Ura    7 年前

    已经有很好的答案了,我只是想给你一个提示,你可以稍微调整一下你的逻辑

    num = ['1','2']
    letter1 = ['a','b' ,'c', 'd', 'e', 'f']
    letter2 = ['aa' ,'bb', 'cc', 'dd' ,'ee' ,'ff']
    tuple1 = tuple(zip(*[[int(num[0])]*len(letter1),letter1]))
    tuple2 = tuple(zip(*[[int(num[1])]*len(letter2), letter2]))
    
    print(tuple1)
    print(tuple2)
    

    输出:

    ((1, 'a'), (1, 'b'), (1, 'c'), (1, 'd'), (1, 'e'), (1, 'f'))
    ((2, 'aa'), (2, 'bb'), (2, 'cc'), (2, 'dd'), (2, 'ee'), (2, 'ff'))
    
    推荐文章