附加到具有未知维度的嵌套列表

时间:2017-05-31 06:45:40

标签: python list multidimensional-array nested nested-lists

我想根据需要从用户那里获取嵌套列表的尺寸。 然后将用户给出的字符串附加到相应的元素。 在嵌套列表中找到最大长度的字符串,以正确地左对齐文本。 然后左对齐字符串以表格形式打印字符串。 该计划应该是这个

Enter the number of main items in the list: 3
Enter the number of sub items that each list will contain: 4
(1,1):apples
(1,2):oranges
(1,3):cherries
(1,4):banana
(2,1):Alice
(2,2):Bob
(2,3):Carol
(2,4):David
(3,1):dogs
(3,2):cats
(3,3):moose
(3,4):goose
Following list must be created in the program
listOfList= [ ['apples', 'oranges', 'cherries', 'banana'],
              ['Alice', 'Bob', 'Carol', 'David'],
              ['dogs', 'cats', 'moose', 'goose']]
output given by a print table function should be like this:
'''
apples   Alice  dogs
oranges  Bob    cats
cherries Carol  moose
banana   David  goose

这是我的实际代码

#Organising Lists of Lists in tablular Form
x=int(input("Enter the number of main items in the list: "))
y=int(input("Enter the number of sub items that each list will contain: "))
listOfList=[[]]
for i in range(x):
    for j in range(y):
        listOfList[i][j]=input('('+str(i+1)+','+str(j+1)+'):')
def printTable(nestedList):
    maxLen=0
    #this loop finds the max Length of any string in the nestedList
    for i in range(x):
        for j in range(y):
            if len(nestedList[i][j])>maxLen:
                maxLen=len(nestedList[i][j])
    #Loop to display table
    for j in range(y):
        for i in range(x):
            print(nestedList[i][j].ljust(maxLen),sep=' ', end='')
        print()
printTable(listOfList)

发生错误:

Enter the number of main items in the list: 3
Enter the number of sub items that each list will contain: 4
(1,1):apples
Traceback (most recent call last):
  File "C:\pyscripts\printTable.py", line 7, in <module>
    listOfList[i][j]=input('('+str(i+1)+','+str(j+1)+'):')
IndexError: list assignment index out of range

3 个答案:

答案 0 :(得分:1)

您看到listOfList有问题

>>>len(listOfList)
1

BUT

>>>len(listOfList[0])
0

表示您的内部列表为空,因此您无法访问listOfList [0] [0]

 >>>listOfList[0][0]
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 IndexError: list index out of range

答案 1 :(得分:1)

其他答案指出了你没有在列表中预先分配空间的关键问题,并且尝试分配给不存在的索引会导致你得到的错误,但是:

您可以通过在输入列表中构建列表来避免预先初始化列表,例如:

x = int(input('X: '))
y = int(input('Y: '))

lol = [
    [input('({},{}): '.format(b, a)) for a in range(1,  y + 1)]
    for b in range(1, x + 1)
]

然后,您可以使用以下方法计算最大字长,而无需显式循环并跟踪最大值:

max_length = max(len(word) for lst in lol for word in lst)

然后,您可以使用zip来转置行/列,并通过将填充词连接到最大长度来打印每一行,而不是循环反向索引,例如:

for line in zip(*lol):
    print(' '.join(word.ljust(max_length) for word in line))

这会给你:

apples   Alice    dogs    
oranges  Bob      cats    
cherries Carol    moose   
banana   David    goose

答案 2 :(得分:0)

您需要先创建列表:

listOfList = [[0 for w in range(y)] for h in range(x)] 

输出:

>>> x = 3
>>> y = 4
>>> listOfList = [[0 for w in range(y)] for h in range(x)]
>>> listOfList
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]