Я пытаюсь умножить только определенное число в списке с четным порядковым номером. В моем списке есть несколько чисел, которые встречаются несколько раз. Эти числа имеют одинаковые значения индекса. Однако я хочу умножить эти числа на 2, только если они встречаются в таком месте, что их порядковый номер четен.

Все форумы, которые я искал, имеют противоположность моей потребности, где они хотят, чтобы повторяющиеся номера имели одинаковый индекс. В моем случае я хочу, чтобы повторяющиеся числа имели разные значения индекса.

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
my_list = []
for i in a:
    if a.index(i) in [1,3,5,7,9]: 
        #get ascii value using ord()
        a1 = (ord(i)) * 2
    else:
        a1 = ord(i)
        my_list.append(a1)

Ожидается = [50, 96, 48, 98, 52, 106, 54, 106, 48, 104, 54]

Получил = [50, 52, 54, 52, 52, 54]

1
loki 1 Май 2019 в 05:28

6 ответов

Лучший ответ

Вы должны использовать enumerate вместо index. Кроме того, вы можете сделать это понимание списка:

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
result = [ord(c) * 2 if i % 2 == 1 else ord(c) for i, c in enumerate(a)]
print(result)
# [50, 96, 48, 98, 52, 106, 54, 104, 48, 104, 54]

Петлевый эквивалент:

result = []
for i, c in enumerate(a):
    if i % 2 == 1:
         result.append(ord(c) * 2)
    else:
         result.append(ord(c))
3
iz_ 1 Май 2019 в 02:50

Просто добавьте my_list.append(a1) к вашему выражению if:

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
my_list = []
for i in a:
    if a.index(i) in [1,3,5,7,9]: 
        #get ascii value using ord()
        a1 = (ord(i)) * 2
        my_list.append(a1)
    else:
        a1 = ord(i)
        my_list.append(a1)

Или лучше, просто выполните его после else:

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
my_list = []
for i in a:
    if a.index(i) in [1,3,5,7,9]: 
        #get ascii value using ord()
        a1 = (ord(i)) * 2
    else:
        a1 = ord(i)
    my_list.append(a1)
0
Alec Alameddine 1 Май 2019 в 02:33

Здесь есть две основные проблемы. Как уже упоминали другие, вам нужно переместить append за пределы ветви else. Вы также отбрасываете текущий индекс элемента списка, когда просматриваете его, а затем просматриваете a.index(i) - это не даст правильного результата в случае повторяющихся элементов, потому что он вернет индекс первого совпадения. Вы могли бы, например, используйте функцию enumerate, чтобы получить индекс и элемент в цикле.

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
my_list = []
for idx, i in enumerate(a):
    if idx in [1,3,5,7,9]: 
        #get ascii value using ord()
        a1 = (ord(i)) * 2
    else:
        a1 = ord(i)
    my_list.append(a1)
0
lehiester 1 Май 2019 в 02:41

Другие ответы были связаны с фундаментальной проблемой (расположение append()), но если вы хотите быть кричащим, вы можете сделать это в понимании списка в одну строку:

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
my_list = [ord(a[i])*2 if i % 2 == 1 else ord(a[i]) for i in range(len(a))]
1
Alec Alameddine 1 Май 2019 в 02:47

Вы не можете добавить в список, если условие

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
my_list = []
for i in a:
    if a.index(i) in [1,3,5,7,9]: 
        #get ascii value using ord()
        a1 = (ord(i)) * 2
        my_list.append(a1)
    else:
        a1 = ord(i)
        my_list.append(a1)
1
Alec Alameddine 1 Май 2019 в 02:47

Вы добавляете только в свою ветку else

a = ['2', '0', '0', '1', '4', '5', '6', '4', '0', '4', '6']
my_list = []
for i in a:
    if a.index(i) in [1,3,5,7,9]: 
        #get ascii value using ord()
        a1 = (ord(i)) * 2
    else:
        a1 = ord(i)
    my_list.append(a1)
2
Alec Alameddine 1 Май 2019 в 02:48