将子列表分成多个列表并分配动态list_name

时间:2019-05-13 19:48:52

标签: python

我正在尝试将一个嵌套列表拆分为多个列表,并动态分配其名称。直到现在,我都尝试了下面的代码,但是只有在子列表的长度相等并且我们手动为其命名时,它才起作用。

sub_list = [[1,2,3],[4,5], [2]]

当我们有不等长的子列表(如(x,y,w,h = cv2.boundingRect(contour) outlined_image = cv2.rectangle(image, (x, y), (x + w, y + h), (0,255,0), 1) cv2.putText(outlined_image, 'Fedex', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (100,255,100), 2) )并且没有给出列表动态名称时,上述方法将失败。

我知道可以通过for循环来完成,但是我无法使用循环来创建list_name。

任何帮助都将帮助我进一步结束工作

4 个答案:

答案 0 :(得分:0)

您可以按以下方式使用zip_longest中的itertools

sub_list = [[1,2,3],[4,5], [2]]
from itertools import zip_longest
l1, l2, l3 = map(list, zip_longest(*sub_list))
print(l1)
print(l2)
print(l3)

Output:  
# [1, 4, 2]
# [2, 5, None]
# [3, None, None]

答案 1 :(得分:0)

回答第一个问题:如果您不想提供手动名称,则将map()仅仅添加到一个变量中:

sub_list = [[1,2,3],[4,5,5],   [2,63,6]]

rotated = map(list, zip(*sub_list))

for r in rotated:
    print(r)

# Output
# [1, 4, 2]
# [2, 5, 63]
# [3, 5, 6]

答案 2 :(得分:0)

不确定要完成什么,但是我建议您看一下:

答案 3 :(得分:0)

在您的两种特殊情况下,以下代码都将执行:

  1. 如果某些输入列表比其他输入列表短,则没有错误
  2. 名称是通过过程/动态生成的

    def rotate_list_matrix(rows):
        nrows = len(rows)
    
        col_counts = map(lambda lyst: len(lyst), rows)
        ncols = max(col_counts)
    
        for ci in range(0, ncols): # column index
            lyst = list()
            list_name = "l" + str(ci + 1)
            globals()[list_name] = lyst
            for ri in range(0, nrows):
                try:
                    lyst.append(rows[ri][ci])
                except:
                    break
        return
    
    
    list_mata = [[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]]
    
    list_matb = [[1, 2, 3],
                 [4, 5   ],
                 [7      ]]
    
    rotate_list_matrix(list_matb)
    
    print(l1)
    print(l2)
    print(l3)