我打算在这里问这个问题。但是在我做之前我就解决了。我希望能够以更有序的方式打印这个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,然后是三个等等。每个之间都有一个空格。
答案 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组不同的水桶。当key
(groupby
)的第二个参数的结果从存储桶更改为存储桶时,将形成组。此外,如果您不从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的建议,该建议在仅使用必要资源的同时保留了令人敬畏的效果。