Я ищу способ автоматизировать процесс, при котором я добавляю только элементы, которые имеют определенные значения в очень конкретной позиции значения списка. Я знаю, это звучит сложно, но я пытаюсь лучше объяснить себя на этом тривиальном примере: у меня есть все эти индексы:

["0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"]

Я хочу суммировать все индексы, которые у них есть 0 или 1 в позиции x и 0 или 1 в позиции y. В этом случае я хочу суммировать все подсчеты, которые у них 0 в позиции 1 (справа) и 1 в позиции 0 (справа) в их индексе.

"01": counts["0001"] + counts["0101"] + counts["1001"] + counts["1101"]

Для большей наглядности в этом случае я суммирую все подсчеты, которые имеют 1 в позиции 1 (справа) и 0 в позиции 0 в их индексе.

"10": counts["0010"] + counts["0110"] + counts["1010"] + counts["1110"]

Могу ли я найти автоматизацию для этого в Python?

ИЗМЕНИТЬ : Постараюсь уточнить:

counts = {'0001': 0.0001220703125, '0010': 0.000244140625, '0100': 0.0003662109375, '0101': 0.245849609375, '0110': 0.2486572265625, '0111': 0.000244140625, '1000': 0.0009765625, '1001': 0.2508544921875, '1010': 0.252197265625, '1101': 0.00048828125, '0000': 0.0, '0011': 0.0, '1011': 0.0, '1100': 0.0, '1110': 0.0, '1111': 0.0}

Например, мне нужно получить весь индекс, который у них 00 посередине (позиции 1 и 2). Поэтому мне нужно выбрать: «0001», «1000», «1001», «0000», которые содержат 0 в позиции 1 и 0 в позиции 2. И я хочу просуммировать все эти значения. '1101' не подходит, потому что содержит по порядку: 1 в позиции 0, 0 в позиции 1, 1 в позиции 2 и 1 в позиции 3.

Единственное, что я знаю, - это значения того, что я хочу (это 2, которые могут принимать значения 0 или 1) и их положение (которое равно 0, 1, 2 или 3).

Надеюсь, я был чист

1
Marco Gobbo 24 Янв 2021 в 17:27

3 ответа

Лучший ответ

Вы ищете что-то вроде этого:

counts = {'0001': 0.0001220703125, '0010': 0.000244140625, '0100': 0.0003662109375, '0101': 0.245849609375, '0110': 0.2486572265625, '0111': 0.000244140625, '1000': 0.0009765625, '1001': 0.2508544921875, '1010': 0.252197265625, '1101': 0.00048828125, '0000': 0.0, '0011': 0.0, '1011': 0.0, '1100': 0.0, '1110': 0.0, '1111': 0.0}

def addcts(keystr, x, xv, y, yv):
    if x > len(keystr) or y > len(keystr):
        return False
    if keystr[x] == str(xv) and keystr[y] == str(yv):
        return True
    return False

print(sum([kel[1] for kel in counts.items() if addcts(kel[0], 2, 1, 3, 0)])) # 1 at position 2 and 0 at position 3

Что приводит к 0.5010986328125 (результат, который вы ищете)?

РЕДАКТИРОВАТЬ : изменено на основе ввода из комментария

0
GrimTrigger 24 Янв 2021 в 17:18

Я предполагаю, что ваши индексы относятся к словарю. Я создаю здесь новый на основе индексов. Мой код будет выглядеть примерно так, если использовать функцию filter для фильтрации словаря по индексу.

testlist = ["0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"]
testdict = {}

to_add_end = "10"

for binary in testlist:
    testdict[binary] = int(binary)

filtered_dict = dict(filter(lambda entry:entry[0][-len(to_add_end):] == to_add_end, testdict.items()))
print(sum(filtered_dict.values()))

Лямбда-функция, которую мы передаем filter:

lambda entry:entry[0][-len(to_add_end):] == to_add_end

Он указывает фильтру сохранять только те элементы, в которых последние n букв [-len(to_add_end):] первой части [0], также известной как ключ, соответствуют окончанию, которое мы хотим сохранить.

0
Lukas Schmid 24 Янв 2021 в 14:41

Вы можете сделать это с помощью условного списка.

my_list = ["0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"]

Затем используйте понимание списка, чтобы пройти по списку

sum_counts01 = len([x for x in my_list if x[-2] == '0'])

Распаковываем это:

  1. 'len' будет принимать количество элементов в списке, так что вы получите количество элементов в my_list, которые соответствуют условию.
  2. [x вместо x в my_list] просто возвращает вам my_list
  3. Но добавив в конце «if x [-2] == '0'], он отфильтрует my_list только для элементов в нем, где предпоследний элемент в строке равен« 0 ».
0
Dharman 24 Янв 2021 в 14:50
65871748