4

我有一个list和一个list of list这样的

>>> list2 = [["1","2","3","4"],["5","6","7","8"],["9","10","11","12"]]
>>> list1 = ["a","b","c"]

我压缩了以上两个列表,以便我可以按索引匹配它们的值索引。

>>> mylist = zip(list1,list2)
>>> mylist
[('a', ['1', '2', '3', '4']), ('b', ['5', '6', '7', '8']), ('c', ['9', '10', '11', '12'])]

现在我尝试使用打印上面的mylist输出

>>> for item in mylist:
...     print item[0]
...     print "---".join(item[1])
...

它导致了这个输出,这是我的desired output.

a
1---2---3---4
b
5---6---7---8
c
9---10---11---12

现在,我的问题是有更多的cleaner and better方法来实现我想要的输出,或者这是best(short and more readable)可能的方法。

4

5 回答 5

8

好吧,您可以避免一些临时变量并使用更好的循环:

for label, vals in zip(list1, list2):
    print label
    print '---'.join(vals)

不过,我认为您不会从根本上得到任何“更好”的东西。

于 2012-05-25T19:05:09.560 回答
5

下面的for循环会将打印和连接操作合并到一行中。

 for item in zip(list1,list2):
     print '{0}\n{1}'.format(item[0],'---'.join(item[1]))
于 2012-05-25T19:07:27.827 回答
3

它可能不像完整的循环解决方案那样可读,但以下内容仍然可读且更短:

>>> zipped = zip(list1, list2) 
>>> print '\n'.join(label + '\n' + '---'.join(vals) for label, vals in zipped)
a
1---2---3---4
b
5---6---7---8
c
9---10---11---12
于 2012-05-25T19:11:15.893 回答
2

这是实现结果的另一种方法。它更短,但我不确定它是否更具可读性:

print '\n'.join([x1 + '\n' + '---'.join(x2) for x1,x2 in zip(list1,list2)])
于 2012-05-25T19:19:16.103 回答
2

您可能认为干净但我不认为是您的程序的其余部分现在需要数据的结构以及如何打印它。恕我直言,应该包含在数据类中,因此您可以做到print mylist并获得所需的结果。

如果您将其与 mgilson 的建议结合使用字典(我什至建议使用 OrderedDict),我会这样做:

from collections import OrderedDict

class MyList(list):
    def __init__(self, *args):
        list.__init__(self, list(args))

    def __str__(self):
        return '---'.join(self)

class MyDict(OrderedDict):
    def __str__(self):
        ret_val = []
        for k, v in self.iteritems():
            ret_val.extend((k, str(v)))
        return '\n'.join(ret_val)

mydata = MyDict([
    ('a', MyList("1","2","3","4")),
    ('b', MyList("5","6","7","8")),
    ('c', MyList("9","10","11","12")),
])

print mydata

不需要程序的其余部分需要知道打印此数据的详细信息。

于 2012-05-25T19:50:45.393 回答