Я ищу способ автоматизировать процесс, при котором я добавляю только элементы, которые имеют определенные значения в очень конкретной позиции значения списка. Я знаю, это звучит сложно, но я пытаюсь лучше объяснить себя на этом тривиальном примере: у меня есть все эти индексы:
["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).
Надеюсь, я был чист
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
(результат, который вы ищете)?
РЕДАКТИРОВАТЬ : изменено на основе ввода из комментария
Я предполагаю, что ваши индексы относятся к словарю. Я создаю здесь новый на основе индексов. Мой код будет выглядеть примерно так, если использовать функцию 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]
, также известной как ключ, соответствуют окончанию, которое мы хотим сохранить.
Вы можете сделать это с помощью условного списка.
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'])
Распаковываем это:
- 'len' будет принимать количество элементов в списке, так что вы получите количество элементов в my_list, которые соответствуют условию.
- [x вместо x в my_list] просто возвращает вам my_list
- Но добавив в конце «if x [-2] == '0'], он отфильтрует my_list только для элементов в нем, где предпоследний элемент в строке равен« 0 ».
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.