如何每行打印x个项目

时间:2013-12-09 18:16:38

标签: python python-2.7 line

我打算在这里问这个问题。但是在我做之前我就解决了。我希望能够以更有序的方式打印这个Python 2.7列表。

not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]

for i in not_shuffled_deck:
    print i + "|",

这就是它最初的结果。

嗯,它实际上比它在这里显示的更糟糕。这取决于控制台大小,屏幕大小,是否有文本换行等。所以在我使用的控制台中,甚至在普通的文本编辑器中,它将以难以阅读的方式显示在多行上

 2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts| 3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts| 4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts| 5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts| 6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts| 7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts| 8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts| 9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts| 

所以我想要一种方法来在一行上打印四个2,然后是三个等等。每个之间都有一个空格。

5 个答案:

答案 0 :(得分:5)

对字符串中的第一项进行分组:

from itertools import groupby

for _, group in groupby(not_shuffled_deck, lambda c: c.split()[0]):
    print '| '.join(group)
    print

演示:

>>> from itertools import groupby
>>> not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]
>>> for _, group in groupby(not_shuffled_deck, lambda c: c.split()[0]):
...     print '| '.join(group)
...     print
... 
2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts

3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts

4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts

5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts

6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts

7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts

8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts

9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts

你问:

  

你能否给我一个关于公式如何的外行解释   作品?

这一切围绕着lambda功能; groupby()not_shuffled_deck获取每个值,并仅查看该函数的输出。 c.split()在空格上拆分卡片串,只返回第一个元素,因此'2''3'等等。

所以groupby然后产生第一个字符相等的组;列表的第一个元素,第二个元素,第三个元素和第四个元素都有'2'作为其字符串中的第一个元素。 _将被设置为'2'(但我在此忽略它),group是一个可迭代的,产生这4个元素;我们将该值传递给'| '.join()以生成要打印的新字符串。

我总是把迭代画作斗式旅;一排排人员从河流或水井或水泵中流过一桶水。无论铲斗来自何处,您都不知道还有多少挡不到,但您所能做的就是采取下一个铲斗。 groupby就像有人组织新的迷你斗旅,为你提供它所处理的一些水桶。

所以你要求groupby根据用水捕获的鱼数来分组水桶。他会首先给你一个人说:我只给你两桶鱼。你不断要求水桶,而且在某些时候,那个人说:不管,没有水桶,我已经没有你了。然后你回到groupby仲裁者,他说,这里是一个新人,他只会传递4条鱼的水桶。然后你和那个4个鱼缸的家伙聊了一会儿。

在我的回答中,not_shuffled_deck是好的(在某些时候它会用完水),groupby不计算鱼类但仅查看字符串的第一部分,并且group是给你桶的人,它们都具有相同的字符串的第一部分。

因为这是一个斗式旅,groupby不知道接下来会发生什么,所以如果有一堆水桶有2条鱼,那么后面跟着一堆3条鱼,然后是另一堆只有2条鱼再次,你会得到3个不同的人交给你3组不同的水桶。当keygroupby的第二个参数的结果从存储桶更改为存储桶时,将形成组。此外,如果您不从group人那里拿走所有桶,那么groupby将丢弃桶。 将它们倒在地上

如果您正在服用2-fish鱼群,但又回到groupby仲裁者要求新的团体成员,仲裁者会将所有桶中的2条鱼扔掉,直到它找到在给你一个新人交谈之前,用不同数量的鱼。你不能再回到2-fish团队的人那里请求更多水桶,现在这些水桶已经在街上清空了。

答案 1 :(得分:2)

您可以使用itertools.islice将列表均匀地拆分为4个组。

>>> from itertools import islice
>>> from math import ceil
>>> it = iter(not_shuffled_deck)
for _ in xrange(int(math.ceil(len(not_shuffled_deck)/4.))):
    data = islice(it, 4)
    print '| '.join(data)
...     
2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts
3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts
4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts
5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts
6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts
7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts
8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts
9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts

或使用列表切片(slice notation):

>>> n = int(math.ceil(len(not_shuffled_deck)/4.))
>>> for i in xrange(0, n*4, 4): 
    print '| '.join(not_shuffled_deck[i:i+4])
...     
2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts
3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts
4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts
5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts
6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts
7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts
8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts
9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts

答案 2 :(得分:1)

这就是我提出的答案,这不仅适用于我现在需要的,也适用于将来可能出现的其他一些可能性。

not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]

i = 0
for eachCard in not_shuffled_deck:
    if i % 4 == 0 and i != 0:
        print "\n"
        print eachCard + "|",
        i += 1
    else:
        print eachCard + "|",
        i += 1

打印出来

2 of spades| 2 of diamonds| 2 of clubs| 2 of hearts| 

3 of spades| 3 of diamonds| 3 of clubs| 3 of hearts| 

4 of spades| 4 of diamonds| 4 of clubs| 4 of hearts| 

5 of spades| 5 of diamonds| 5 of clubs| 5 of hearts| 

6 of spades| 6 of diamonds| 6 of clubs| 6 of hearts| 

7 of spades| 7 of diamonds| 7 of clubs| 7 of hearts| 

8 of spades| 8 of diamonds| 8 of clubs| 8 of hearts| 

9 of spades| 9 of diamonds| 9 of clubs| 9 of hearts|

答案 3 :(得分:1)

我有另一种使用join和split的解决方案:

not_shuffled_deck = ["%i of %s" % (i, s) for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')]
print(" " +"hearts\n".join("| ".join(not_shuffled_deck).split("hearts|")))

答案 4 :(得分:0)

所以不要这样做,因为@MartijnPieters指出你浪费周期和内存来创建None的列表,但这是我的回答列表理解(因为我爱他们!)

my_deck_with_returns = []

[my_deck_with_returns.append(' {} of {} |'.format(i, s))
 for i in range(2,10) for s in ('spades', 'diamonds', 'clubs', 'hearts')
 if s != 'spades' or not my_deck_with_returns.append('\n')]

print ''.join(my_deck_with_returns)

向下滚动以获取@MartijnPieters的建议,该建议在仅使用必要资源的同时保留了令人敬畏的效果。