Есть ли способ добавлять и вычитать числа из списка последовательно? - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь сложить и вычесть каждое число в списке, например, 1 - 1/3 + 1/5 - 1/7 + 1/9. Если вы продолжите делать это, а затем умножите ответ на 4, вы получите приблизительное число пи.

У меня есть список нечетных чисел, называемых ODD, но у меня возникают проблемы с добавлением и вычитанием, как показано выше

Я буквально только что начал кодировать python сегодня, так что это может быть простой ошибкой, но я не могу найти в Интернете ничего об этом

Спасибо, Адам

import time
start_time = time.time()


EVEN = []
ODD = []
y = int(1.e2)
x = range(y)
#-----------------------------------------------------------------------------------------
for i in x:
    if i%2 == 0:  
        print(i)
        EVEN.append(i)
    else:
        print(i)
        ODD.append(i)

oc = len(ODD)
ec = len(EVEN)
print("")
print(str(oc) + " " + "Odds Found!")
print(str(ec) + " " + "Evens Found!")
print("--- %s seconds to compute ---" % "{:.2f}".format(((time.time() - start_time))))

time.sleep(3)    #START OF PROBLEM
for i in ODD:
    fract = 1/ODD[i]-1/ODD[i+1]
    sfract = fract + 1/ODD[i+2]
    print(fract)
    print(sfract)


Ответы [ 5 ]

3 голосов
/ 22 марта 2020

Ваша проблема в том, что этот l oop

for i in ODD:

перебирает элементы в списке (для каждого l oop). Вот почему ODD [i] может привести к ошибке индекса или вычислить что-то еще, кроме того, что вас интересует. Вы должны просто использовать переменную i.

    flag = True
    for i in ODD:
       if flag:
          fract += 1 / i
       else:
          fract -= 1/ i
       flag = not flag

Кроме того, поскольку вы пишете в Python Я бы рекомендовал использовать понимание списка:

EVEN = [i for i in x if i % 2 == 0]
ODD = [i for i in x if i % 2 == 1]
2 голосов
/ 22 марта 2020

Нет абсолютно никакой необходимости использовать какие-либо списки в этой программе.

arbitrary_number = 1000
sign = 1
total = 0
for n in range(1, arbitrary_number, 2):
   total += sign * 1.0 / n
   sign = -sign
print(4*total)
1 голос
/ 22 марта 2020

Я написал это с намерением сделать каждый шаг ясным. Есть более простые способы написать это с меньшим количеством кода. Помните, что Python сделано просто. Обычно есть один прозрачный способ найти решение, но всегда старайтесь экспериментировать.

number = 0 #initialize a number. This number will be your approximation so set it to zero.
count = 0 #set a count to check for even or odd [from the formula] (-1)^n
for num in range(1,100,2): #skip even values.
"""
The way range works in this case is that you start with 1, end at 100 or an arbitrary 
number of your choice and you add two every time you increment. 
For each number in this range, do stuff.
"""
    if count%2 == 0: #if the count is even add the value
        number += 1/num #example add 1, 1/5, 1/9... from number
        count += 1 #in order to increment count
    else: #when count is odd subtract
        number -= 1/num  #example subtract 1/3, 1/7, 1/11... from number
        count += 1 #increment count by one

number = number*4 #multiply by 4 to get your approximation.

Надеюсь, это поможет и добро пожаловать на Python!

0 голосов
/ 23 марта 2020

Если вам нужно последовательно добавлять и вычитать список, вы можете использовать операцию среза Python для создания 2 списков с нечетными и четными индексами.

# Example list
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# [1, 3, 5, 7, 9]
add_list = lst[0::2]

# [2, 4, 6, 8]
subtract_list = lst[1::2]

# Now you can add all the even positions and subtract all the odd
answer = sum(add_list) - sum(subtract_list) # Same as 1-2+3-4+5-6+7-8+9
0 голосов
/ 22 марта 2020

Давайте рассмотрим для l oop:

for i in ODD:
    fract = 1/ODD[i]-1/ODD[i+1]
    sfract = fract + 1/ODD[i+2]
    print(fract)
    print(sfract)

, поскольку вы объявляете fract & sfract внутри l oop, они не вычисляют сумму, а только два и три условия суммы, соответственно. Если вы инициализируете переменные вне l oop, их область действия позволит им накапливать значения.

Для того, что вы делаете, я бы использовал numpy.float для этих переменных, чтобы предотвратить переполнение.

...