Формирование списка троичных чисел длиной l с возможностью посимвольного запроса в python

Не видел, чтобы кто-то предлагал мои обычные варианты:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

Я предпочитаю это, потому что вы можете использовать ctrl + c, чтобы останавливать и перемещаться по файлу всякий раз, а затем просто нажмите shift + f, чтобы вернуться к текущему потоковому поиску.

-3
задан Tiw 4 March 2019 в 03:02
поделиться

1 ответ

itertools.product, кажется, дает вам то, что вы ищете. Он часто используется вместо вложенных for циклов, но имеет удобный repeat kwarg, который облегчает вашу жизнь здесь.

l = 3  # that's a lower-case L. Never use that in code, though, it looks like a 1.

digits = itertools.product(range(3), repeat=l)

# is equivalent to

def my_product():
    """the same as above itertools.product if l==3"""
    for i in range(3):
        for j in range(3):
            for k in range(3):
                yield (i, j, k)
my_digits = my_product()  # YUCK!

Это создает генератор (примечание: не список!), Который генерирует все значения, которые вы ищете от (0, 0, 0) до (2, 2, 2). Чтобы составить список, просто приведите его к одному.

digits = list(itertools.product(range(3), repeat=l))  # still a lower-case L. Still don't do this.

Затем, чтобы сравнить цифры, просто используйте индексацию, как любой список 2D.

first_value = digits[0]
first_digit = first_value[0]
assert first_digit == digits[0][0]

second_value = digits[1]
first_digit_of_second_value = second_value[0]
assert first_digit_of_second_value == digits[1][0]

if digits[0][0] == digits[1][0]:
    # that's these two:  v          v
    # digits ==         (0, 0, 0), (0, 0, 1), (0, 0, 2), ...
    do_whatever_you_want()

Если вы хотите специально вывести (0, 0, 0) как 000, вы можете написать для этого функцию:

def sprint_tuple(tup):
    """Takes a tuple of digits and pretty Sprints them.

    >>> sprint_tuple((0, 0, 1))
    '001'
    """

    return ''.join([str(i) for i in tup])

, затем выполнить цикл по digits и напечатать каждый:

]
>>> for tup in digits:
...     print(sprint_tuple(tup))
000
001
002
010
...
222
0
ответ дан Adam Smith 4 March 2019 в 03:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: