如何使用 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 和那个小逗号技巧的作用也很好。