将用户输入拆分为越来越大的列表[python]

时间:2018-05-24 16:53:00

标签: python python-3.x list

我正在尝试生成一个代码,用于验证用户输入是否符合pascal三角形的条件。我知道如何输入行数并使其形成一个pascal三角形,但我无法弄清楚如何让用户输入类似1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1的内容,并让我的程序说明它是否是帕斯卡三角与否。

values = input("Enter the numbers: ").split()

pascals_triangle = list(map(list, values))

我知道第一行可以拆分数字,第二行会将数字分配到列表的各个列表中。每当我尝试将列表每行增加1时,我会收到str/int个错误。一旦我越过这个小路障,我应该能够找出其余的代码。

data = input("Enter values: ").split()


def pascal_triangle(data):
    size = int(data[0])
    n = 2 * size + 1
    grid = [[0 for x in range(n)] for y in range(size)]

    left = 1
    for i in range(size, 0, -1):
        grids = data[i].split(' ')
        count = 0
        for g in grids:
            grid[i - 1][left + 2 * count] = int(g)
            count += 1
        left += 1
        if count != i:
            return False

    left = 1
    for i in range(size - 1, -1, -1):
        if i == 0:
            return grid[i][left] == 1
        numbers = i + 1
        count = 0
        while count < numbers:
            current = grid[i][left + count * 2]
            upper_left = grid[i - 1][left - 1 + count * 2]
            upper_right = grid[i - 1][left + 1 + count * 2]
            if current != (upper_left + upper_right):
                return False
            count += 1

        left += 1
    return False



status = pascal_triangle(data)
if status:
    print('It is a pascal triangle')
else:
    print('It is not a pascal triangle')

所以,在这段代码中,为什么我仍然没有得到准确的答案?

2 个答案:

答案 0 :(得分:0)

如果您尝试以某种奇特的方式执行此操作,例如调整grouper文档中的itertools配方以采用可变的组大小而不是固定的组大小...请采取措施回来并先写下“哑”版本。 - 只需写一个循环。

首先,拆分整个字符串,就像在逐行版本中拆分每一行一样。

一件事:将list映射到您的值上将不会有任何好处;只会将'23'转变为['2', '3'],而且你可以用它做很多好事。您需要一个数字列表,然后您将分成一行(每行也是一个数字列表 - 通过在您的行中intline.split()映射获得的相同行-by-line version)。

所以,这里有一些伪代码:

values = input("Enter the numbers: ").split()
nums = [int(value) for value in values]
size = 1
start = 0
while start < len(nums):
    rownums = nums[start:start+size]
    make sure len(rownums) == size
    check rownums the same way you checked each line
    update size and start
if you got here without seeing any errors, it's valid

答案 1 :(得分:0)

执行此操作的一种方法是生成Pascal三角形的每一行,并使用islice从用户数据中获取当前行长度的列表,并查看数据是否与该行匹配。

from itertools import islice

def pascal():
    """ Pascal's triangle generator """
    a = [1]
    while True:
        yield a
        #Generate next row from current row
        a = [x + y for x, y in zip([0] + a, a + [0])]

def test_pascal(values):
    it = map(int, values.split())
    ok = True
    for row in pascal():
        data = list(islice(it, len(row)))
        if not data:
            break
        if data != row:
            ok = False
            print('bad data', data, row)
            break
    return ok

# Test

values = '1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1'
print(test_pascal(values))

values = '1 1 1 1 2 1 1 3 3 1 1 4 6 5 1'
print(test_pascal(values))

<强>输出

True
bad data [1, 4, 6, 5, 1] [1, 4, 6, 4, 1]
False