如何使用 python 在 kv 标签的不同行中显示嵌套列表?
How can I use python to display nested lists in separate lines in kv label?
我有一个列表列表,其中每个内部列表有 3 个项目(如下例所示)。
data = [
["abe","abo","aba"],
["ade","acd","acr"],
["adr","adw","adz"],
["akw","aky","akz"],
["bad","bbf","btr"],
["bst","bsv","bus"]
]
在 kv 文件中,我设置了一个标签(在 ScrollView 内)以在用户按下给定按钮时显示列表中的信息。
> ScrollView:
pos_hint_y: 'bottom'
size_hint_y: 0.65
id:scroll
Label:
id: mylabel
text: 'Choose a letter to display the list'
text_size: (self.width, None)
size_hint_y: None
height: self.texture_size[1]
padding_x:20
valign: ('top')
halign: ('left')
现在(按原样)标签显示我想要的信息,但是连续不断。
> def btn_a(self):
self.l = self.mylabel # reference to mylabel in kv.file
self.l.bind(size=lambda s, w: s.setter('text_size')(s, w)) # binding
a_list = [x for x in self.data if x[0][0] == "a"] # getting info starting with letter "a"
self.l.text = str(a_list) # setting the info inside the label
我想要这样显示信息:
abe, abo, aba
ade, acd, acr
adr, adw, adz
akw, aky, akz
我尝试过使用“\n”.join(),尝试过将列表展平,使用循环和一组您会嘲笑的其他解决方案...我在编程和我想学习,但这让我睡不着觉。请帮忙!如何每行分隔 3 个项目(没有方括号,但有逗号)?
假设您的数据与您指定的一样,这应该可以解决问题:
"\n".join(["%s, %s, %s" % (a, b, c) for a, b, c in data])
将生成一个列表,其中每行有 3 个以逗号分隔的字符串。
编辑:为了完整起见,这也可以更一般地完成:
"\n".join([", ".join(entry) for entry in data])
这适用于列表或内部列表可以是任意长度的列表。
我不知道 'kivy' 和结果的 UI-views 方面,但是只要打印所需的字符串,您可以这样做:
for triplet in data:
print(', '.join(triplet))
如果您希望将其作为字符串而不是打印到控制台,您可以这样做:
composed_string = '\n'.join([', '.join(triplet) for triplet in data])
print(composed_string)
这是您可以尝试的替代版本,这样您就可以练习以不同的方式操作列表:
for x in data:
for y in x:
print y,
print "\n",
请注意,打印语句末尾的逗号会阻止它自己添加一个新行,因为它通常会这样做
或者,你可以用一种奇怪的 hackkey 方式来做,并尝试不打印任何内容(或 space),这将添加你需要的换行符来分隔列表列表。
for x in data:
for y in x:
print y,
print
我知道这不是最好的方法;我只是想表明总有其他方法可以解决问题。对于早期学习者来说,练习尝试寻找各种解决方案可能是一个很好的练习。了解 print 对 \n
和那个小逗号技巧的作用也很好。
我有一个列表列表,其中每个内部列表有 3 个项目(如下例所示)。
data = [ ["abe","abo","aba"], ["ade","acd","acr"], ["adr","adw","adz"], ["akw","aky","akz"], ["bad","bbf","btr"], ["bst","bsv","bus"] ]
在 kv 文件中,我设置了一个标签(在 ScrollView 内)以在用户按下给定按钮时显示列表中的信息。
> ScrollView:
pos_hint_y: 'bottom'
size_hint_y: 0.65
id:scroll
Label:
id: mylabel
text: 'Choose a letter to display the list'
text_size: (self.width, None)
size_hint_y: None
height: self.texture_size[1]
padding_x:20
valign: ('top')
halign: ('left')
现在(按原样)标签显示我想要的信息,但是连续不断。
> def btn_a(self):
self.l = self.mylabel # reference to mylabel in kv.file
self.l.bind(size=lambda s, w: s.setter('text_size')(s, w)) # binding
a_list = [x for x in self.data if x[0][0] == "a"] # getting info starting with letter "a"
self.l.text = str(a_list) # setting the info inside the label
我想要这样显示信息:
abe, abo, aba
ade, acd, acr
adr, adw, adz
akw, aky, akz
我尝试过使用“\n”.join(),尝试过将列表展平,使用循环和一组您会嘲笑的其他解决方案...我在编程和我想学习,但这让我睡不着觉。请帮忙!如何每行分隔 3 个项目(没有方括号,但有逗号)?
假设您的数据与您指定的一样,这应该可以解决问题:
"\n".join(["%s, %s, %s" % (a, b, c) for a, b, c in data])
将生成一个列表,其中每行有 3 个以逗号分隔的字符串。
编辑:为了完整起见,这也可以更一般地完成:
"\n".join([", ".join(entry) for entry in data])
这适用于列表或内部列表可以是任意长度的列表。
我不知道 'kivy' 和结果的 UI-views 方面,但是只要打印所需的字符串,您可以这样做:
for triplet in data:
print(', '.join(triplet))
如果您希望将其作为字符串而不是打印到控制台,您可以这样做:
composed_string = '\n'.join([', '.join(triplet) for triplet in data])
print(composed_string)
这是您可以尝试的替代版本,这样您就可以练习以不同的方式操作列表:
for x in data:
for y in x:
print y,
print "\n",
请注意,打印语句末尾的逗号会阻止它自己添加一个新行,因为它通常会这样做
或者,你可以用一种奇怪的 hackkey 方式来做,并尝试不打印任何内容(或 space),这将添加你需要的换行符来分隔列表列表。
for x in data:
for y in x:
print y,
print
我知道这不是最好的方法;我只是想表明总有其他方法可以解决问题。对于早期学习者来说,练习尝试寻找各种解决方案可能是一个很好的练习。了解 print 对 \n
和那个小逗号技巧的作用也很好。