递增列表中的列表(封装列表)

Posted

技术标签:

【中文标题】递增列表中的列表(封装列表)【英文标题】: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 循环的使用是错误的。我查找了一些信息,发现我当然可以遍历一个列表并让它遍历每个项目,例如打印该项目,但是到目前为止,当有一个封装列表时,我不知道如何实现这个想法我想循环播放。

【问题讨论】:

不要更改问题以包含答案,这对未来的观众没有帮助。 【参考方案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)

【讨论】:

以上是关于递增列表中的列表(封装列表)的主要内容,如果未能解决你的问题,请参考以下文章

php中怎么把下拉列表中的数据按字母排序,并实现拼音的搜索啊

使用循环为列表中的变量赋值

在WPF中怎么将ComboBox的下拉列表的数据进行绑定?还有能不能TXT文件中的列表?

做一个递增的数组,同时修改数组

Redis在C#中的使用及Redis的封装

python3检查列表、元组、字符串中的重复元素