【问题标题】:Append to a nested list with unknown dimensions附加到未知维度的嵌套列表
【发布时间】:2017-10-31 19:55:34
【问题描述】:

我想根据用户的需要获取嵌套列表的尺寸。 然后将用户给出的字符串附加到相应的元素上。 在嵌套列表中找到最大长度的字符串以正确左对齐文本。 然后左对齐字符串以以表格形式打印字符串。 该程序应该解决这个问题

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

【问题讨论】:

  • 初始化列表并使用它。您正在尝试在空列表中添加索引。我们不能在空列表中分配索引。尝试初始化你会得到答案。

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


【解决方案1】:

您需要先创建您的列表:

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]]

【讨论】:

    【解决方案2】:

    你看你的 listOfList 有问题

    >>>len(listOfList)
    1
    

    但是

    >>>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
    

    【讨论】:

      【解决方案3】:

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

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        相关资源
        最近更新 更多