Как добавить элементы нескольких списков в python - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь подсчитать общее количество сходящихся последовательностей града. В приведенном ниже коде я определяю, является ли последовательность сходящейся или расходящейся для разных значений a, b и x, и выводит список (представляется списком с одним элементом в каждом подсписке). Моя проблема здесь в том, что я не могу найти ИТОГО количество сходящихся последовательностей. Я хотел бы добавить все 1 в моем списке и вывести окончательное значение, чтобы получить этот ответ. Может ли кто-нибудь помочь, пожалуйста?

PS В выводе ниже 1 = сходящийся 0 = расходящийся.

Вот мой код:

def hailstone(a, b, x):
    list = []
    c = 0
    count = []
    for i in range(1, 100):
        if x%2 == 0:
            x = x/2
        else:
            x = a * x + b
        if x not in list:
            list.append(x)
        else:
            break
    if len(list) < 99:
        c = 1 + c
        count.append(c)
    else: pass
    return(count)

def run():
    for a in range(1, 4):
        for b in range(1, 4):
            for x in range(1, 4):
                print(hailstone(a,b,x))      

run()

Вот вывод

[1]
[1]
[1]
[]
[]
[]
[1]
[1]
[1]
[]
[]
[]
[1]
[1]
[1]
[]
[]
[]
[1]
[1]
[1]
[]
[]
[]
[1]
[1]
[1]

Кроме того, вот тип данных для моего списка:

<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>
<class 'list'>

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Подобно @Renaud, я немного упростил ваш код, чтобы сделать его более идиоматическим c (добавлены некоторые комментарии для обозначения изменений). Это предполагает, что вы хотите вернуть 5 (последовательности покрытия (1,1),(1,3),(2,2),(3,1),(3,3)).

# Convert into a T/F (boolean) method for any a, b, x triplet
def is_convergent(a, b, x):
    s = set()  # Use a set for O(1) lookups, not O(n)
    for i in range(1, 100):
        x = (a * x + b) if (x % 2) else (x / 2)
        if x in s:
          return True  # this triplet converged, return True
        s.add(x)
    return False

def run():
    c = 0
    for a in range(1, 4):
        for b in range(1, 4):
            c += all([is_convergent(a,b,x) for x in range(1, 4)])
    return c

print(run())

Если вы намеревались вернуть 15, просто замените all на sum.

0 голосов
/ 02 февраля 2020

Если вы просто хотите посчитать число один или ноль, лучше всего будет вернуть значение c от имени списка подсчета (который будет содержать или 1, или будет пустым ...)

def hailstone(a, b, x):
    list = []
    c = 0
    #count = []
    for i in range(1, 100):
        if x%2 == 0:
            x = x/2
        else:
            x = a * x + b
        if x not in list:
            list.append(x)
        else:
            break
    if len(list) < 99:
        c = 1
    else: pass
    return(c)

def run():
    hailstone_list=[] 
    for a in range(1, 4):
        for b in range(1, 4):
            for x in range(1, 4):
                hailstone_list. append(hailstone(a,b,x))   

     print(hailstone_list.count(1))

run()
...