【问题标题】:Incrementing over a list in a list (encapsulated list)递增列表中的列表(封装列表)
【发布时间】:2018-04-22 15:16:28
【问题描述】:

我在让我的 for 循环工作时遇到了一些麻烦,它应该在一个窗口中创建许多标签。 这是代码sn-p:

import tkinter as tk
root = tk.Tk()
#Frame 1: components
frame1 = tk.Frame(root).grid(row=0)
items = ['REED', 'PIR', 'VIBR', 'REED', 'PIR']
for r in items:
    tk.Label(frame1, text=items[r]).grid(row=r,column=0)
#Frame 2: statusList
frame2 = tk.Frame(root).grid(row=1)
status = [[True, False, True, False],
         ['14:00:00', '13:24:31', '15:58:32', '08:33:01']]
for r in status:
    for s in status[r]:
        tk.Label(frame2, text=status[r][s]).grid(row=s,column=r)
root.mainloop()

它输出错误

TypeError: 列表索引必须是整数或切片,而不是 str

这表明我对 for 循环的使用是错误的。我查找了一些信息,发现我当然可以遍历一个列表并让它遍历每个项目,例如打印该项目,但是到目前为止,当有一个封装列表时,我不知道如何实现这个想法我想循环播放。

【问题讨论】:

  • 不要更改问题以包含答案,这对未来的观众没有帮助。

标签: python python-3.x list for-loop


【解决方案1】:

这里:

for r in items:
    tk.Label(frame1, text=items[r]).grid(row=r,column=0)

python 的 for 循环不是这样工作的。在 for 循环的主体中,r 不是 items 中项目的索引,它项目,所以你需要:

for item in items:
    tk.Label(frame1, text=item).grid(row=???,column=0)

但您似乎还希望项目的索引作为.grid()row 参数传递。为此,您可以使用enumerate(seq),它为seq 的每个元素生成一个(index, item) 元组:

for index, item in enumerate(items):
    tk.Label(frame1, text=item).grid(row=index,column=0)

请注意,您在这里也有类似的问题:

status = [[True, False, True, False],
         ['14:00:00', '13:24:31', '15:58:32', '08:33:01']]
for r in status:
    for s in status[r]:
        tk.Label(frame2, text=status[r][s]).grid(row=s,column=r)

【讨论】:

  • 好的,这确实解决了我的循环问题,只是让我发现我也有窗口问题。但我猜这是另一天的故事。
【解决方案2】:

for s in status[r]: 替换为for s in r:

r 包含 status 的元素(在这种情况下,list 将在内部 for 循环中迭代),不是索引

出于同样的原因,您还应该将text=status[r][s] 替换为text = s

如果你只想要索引,你可以使用:

for i in range(len(lst)):

对于某些list lst,如果您需要索引和元素(在这种情况下,您需要索引来传递列和行值),请使用:

for i, elem in enumerate(lst):

【讨论】:

  • :O 喘气 不是我所期望的,感谢您的快速回答。我试试看
  • 如果你确实想迭代索引,你可以使用for i in range(len(lst)):,但在大多数情况下你想迭代实际元素。
  • @yinnonsanders 最好使用enumerate(lst),如果您想要项目及其索引。
  • @brunodesthuilliers 是的,在代码中错过了这一点。你的回答更好地涵盖了它
【解决方案3】:

您还对frame1 的标签有疑问。如果你依赖enumerate(),你可以修复它:

for row, text in enumerate(items):
    tk.Label(frame1, text=text).grid(row=row,column=0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多