将列表插入到Python {for}循环中的嵌套列表

时间:2017-08-30 12:52:31

标签: python for-loop nested-lists

作为一个习惯用Python写作的项目(目前我唯一知道的语言)我正在写一个Cribbage分数计数器。

我从一组5个数字中找到了所有3个,4个和5个长度的子集。子集全部按数字顺序排序。下面的函数应该按顺序找到数字的子集,例如[1,2,3]或[3,4,5]。

def straight_counter(subset, length):
    straights = []
    a = 0  # Variable for incremental increase
    for i in range(0, length - 2):  # Select one of the first three numbers of    a set of 3-5 (which are already ordered)
        run = 1
        x = 1

        while i + x < length:  # Ensure that we do not go beyond the final index

            if subset[i + x - 1] + 1 == subset[i + x]:  # Is the next number one greater than the currently selected number

                run += 1  # Count how many numbers we have in order (will be maximum of 5)
                x += 1

            else:
                break

这里是我尝试仅按顺序获取所有数字的子集的地方。但是当我尝试将其添加到嵌套列表中时,我每次都会在列表的第一个索引上进行写入,而且当我打印它时,列表只有一个项目

            if run == length:  # If the run of consecutive numbers uses all of the numbers e.g [1, 2, 3] and not [1, 2, 4]

                straights.insert(a, subset)  # I would like to add the list as the first index of a different list

                a += 1  # Increase a so that the next valid subset will be at the next index
                print(straights)

是否有明显的原因发生这种情况?或者可能有更简洁的尝试方式。感谢

例如,从输入的数字列表

[1,1,2,3,4]

我正在尝试创建一个嵌套列表:

[[1,2,3],[1,2,3],[2,3,4],[1,2,3,4],[1,2,3,4]]。

长度为3或更大的所有连续数字集合。

2 个答案:

答案 0 :(得分:0)

好的,这是我的解决方案。想法是找到连续集的第一个和最后一个集。

# -*-coding:Utf-8 -*

data = [1, 4, 5, 6, 10, 15, 16, 17, 18, 22, 25, 26, 27, 28]

from operator import itemgetter
from itertools import groupby

for k, g in groupby(enumerate(data), lambda ix : ix[0] - ix[1]):
    group = list(map(itemgetter(1), g))
    print ((group[0], group[-1]))

此时你得到了这个:

(1, 1)
(4, 6)
(10, 10)
(15, 18)
(22, 22)
(25, 28)

然后你只需要选择正确的,并保持它们(差异超过2)。如果需要,您还可以重新创建列表。

答案 1 :(得分:0)

OP:你提到了5张牌,这些牌将是“保持手牌”+首发或者婴儿床+首发。什么时候还有更多?具体来说,The Play。展望未来,是否应将同一段代码用于两个目的?

想象玩家有A-3-5-7和2-3-4-6

最大计数为(1 + 3 + 5 + 7)+(2 + 3 + 4 + 6)=&gt; 31.虽然组合的数量有限,而且牌的播放次序也有所不同。

顺便说一句:作为Cribbage琐事的一点(双关语),The Sting将会出现在Flix(09/02)和Showtime(09/07)。这是你会看到Cribbage在屏幕上播放的少数几个地方之一。