【问题标题】:How to split elements of a list into a list of lists in Python?如何将列表的元素拆分为 Python 中的列表列表?
【发布时间】:2017-03-14 01:43:18
【问题描述】:

我的示例数据如下所示:

list1 = ['AAAABBBBCCCC','DDDDEEEEFFFF','GGGGHHHHIIII','JJJJKKKKLLLL']

  • 制作一个list1b,将每个元素分成四个一组

list1b = [['AAAA','BBBB','CCCC'],['DDDD','EEEE','FFFF'],['GGGG','HHHH','IIII'],['JJJJ','KKKK','LLLL']]

我尝试为任意长度的元素编写通用代码:

list1a =[]
list1b =[]

for sublist in list1:
    n = 4
    quad = [input[i:i+n] for i in range(0, len(sublist[0]), n)] 
    list1a.append(quadruplets)
    quad =[] #Setting it back to empty list
    list1b.append(list1a)

print list1b

#Error Message: 
 quad = [input[i:i+n] for i in range(0, len(sublist[0]), n)] 
 TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

任何人都可以知道我可能出错的地方以及如何纠正它吗?有没有更简单的方法来做同样的事情?

【问题讨论】:

    标签: python list for-loop typeerror


    【解决方案1】:

    如果你想按相同的字符分组,你可以使用groupby来做到这一点:

    >>> from itertools import groupby
    >>> list1 = ['AAAABBBBCCCC','DDDDEEEEFFFF','GGGGHHHHIIII','JJJJKKKKLLLL']
    >>> [[''.join(g) for k,g in groupby(sl)] for sl in list1]
    [['AAAA', 'BBBB', 'CCCC'], ['DDDD', 'EEEE', 'FFFF'], ['GGGG', 'HHHH', 'IIII'], ['JJJJ', 'KKKK', 'LLLL']]
    

    如果您按长度与按字符进行分区,您可以这样做:

    >>> n=4
    >>> [[s[i:i+n] for i in range(0, len(s), n)] for s in list1]
    [['AAAA', 'BBBB', 'CCCC'], ['DDDD', 'EEEE', 'FFFF'], ['GGGG', 'HHHH', 'IIII'], ['JJJJ', 'KKKK', 'LLLL']]
    

    【讨论】:

    • 我想按元素的数量进行分组,例如。 4 或 8,而不是字母表。我必须将 sl 替换为数字吗?
    • 不,我的错。 sl 不是整数
    • 完美!谢谢
    • 只是一个快速的澄清。如果我有一个列表而不是列表,我应该这样做:eval.in/669557 还是制作一个列表然后将其转换为列表?
    • 我想你可以做任何一个。取决于你想要的输出。你可以先s='AAAABBBBCCCD' 然后[s[i:i+n] for i in range(0, len(s), n)]
    【解决方案2】:

    您只是在代码中使用了错误的变量名:input 应该是 sublistquaruplets 错过了 d,而 sublist[0] 应该只是 sublist

    quadruplets = [sublist[i:i+n] for i in range(0, len(sublist), n)] 
    

    然后,您不需要中间列表,它只会将输出中的相同列表相乘。所以list1a.append 可以是list1b.append 而忘记其余的。 n = 4 没有理由陷入循环,因此您可以将其移出:

    list1 = ['AAAABBBBCCCC','DDDDEEEEFFFF','GGGGHHHHIIII','JJJJKKKKLLL']
    list1b =[]
    n = 4
    
    for sublist in list1:
        quadruplets = [sublist[i:i+n] for i in range(0, len(sublist), n)] 
        list1b.append(quadruplets)
    
    print (list1b)
    

    一旦你有了它,你就可以让它成为一个列表理解:

    list1 = ['AAAABBBBCCCC','DDDDEEEEFFFF','GGGGHHHHIIII','JJJJKKKKLLL']
    n = 4
    list1b = [[sublist[i:i+n] for i in range(0, len(sublist), n)] for sublist in list1]
    print (list1b)
    

    【讨论】:

      【解决方案3】:

      如果在 list1b 之前先生成 list2,可能会更容易。

      list1 = ['AAAABBBBCCCC','DDDDEEEEFFFF','GGGGHHHHIIII','JJJJKKKKLLLL']
      
      list1b = []
      list2 = []
      
      n = 4
      
      for i in range(0, len(list1[0]), n):
          list2.append([x[i:i+n] for x in list1])
      
      for i in range(len(list2[0])):
          list1b.append([x[i] for x in list2])
      

      结果

      list1b = [['AAAA', 'BBBB', 'CCCC'],
                ['DDDD', 'EEEE', 'FFFF'],
                ['GGGG', 'HHHH', 'IIII'],
                ['JJJJ', 'KKKK', 'LLLL']]
      
      list2 = [['AAAA', 'DDDD', 'GGGG', 'JJJJ'], 
               ['BBBB', 'EEEE', 'HHHH', 'KKKK'], 
               ['CCCC', 'FFFF', 'IIII', 'LLLL']]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 2015-05-19
        • 1970-01-01
        • 2023-04-05
        • 2019-09-18
        • 2014-06-02
        相关资源
        最近更新 更多