У меня есть список, который выглядит так,
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
В этом списке каждое число после слова представляет значение слова. Я хочу представить этот список в словаре так, чтобы добавлялось значение каждого повторяющегося слова. Я хочу, чтобы словарь был таким:
dict = {'hello':'2', 'go':'14', 'sit':'6','line':'3','play':'0'}
В списке 'go' встречается дважды с двумя разными значениями, поэтому мы добавляем число, которое появляется сразу после слова, аналогично для других слов. Это мой подход, похоже, не работает.
import csv
with open('teest.txt', 'rb') as input:
count = {}
my_file = input.read()
listt = my_file.split()
i = i + 2
for i in range(len(listt)-1):
if listt[i] in count:
count[listt[i]] = count[listt[i]] + listt[i+1]
else:
count[listt[i]] = listt[i+1]
6 ответов
Вы можете "шагать" по 2 элементам одновременно, используя range () а> . Необязательный третий аргумент в диапазоне позволяет вам определить «пропуск».
диапазон (начало, остановка [, шаг])
Используя это, мы можем создать диапазон индексов, которые пропускаются вперед по 2 за раз, для всей длины вашего списка. Затем мы можем спросить список, какое «имя» находится в этом индексе lista[i]
и что такое «значение» после него lista[i + 1]
.
new_dict = {}
for i in range(0, len(lista), 2):
name = lista[i]
value = lista[i + 1]
# the name already exists
# convert their values to numbers, add them, then convert back to a string
if name in new_dict:
new_dict[name] = str( int(new_dict[name]) + int(value) )
# the name doesn't exist
# simply append it with the value
else:
new_dict[name] = value
Вы можете использовать диапазон (начало, конец, шаги) , чтобы получить конечную точку и разделить список , и просто использовать Counter () из коллекций для Суммируйте значение дубликата ключа и все готово :)
здесь yourdict будет {'go': 14, 'line': 3, 'sit': 6, 'play': 0, 'hello': 2}
from collections import Counter
counter_obj = Counter()
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
items, start = [], 0
for end in range(2,len(lista)+2,2):
print end
items.append(lista[start:end])
start = end
for item in items:
counter_obj[item[0]] += int(item[1])
yourdict = dict(counter_obj)
print yourdict
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
dictionary = {}
for keyword, value in zip(*[iter(lista)]*2): # iterate two at a time
if keyword in dictionary: # if the key is present, add to the existing sum
dictionary[keyword] = dictionary[keyword] + int(value)
else: # if not present, set the value for the first time
dictionary[keyword] = int(value)
print(dictionary)
Выход:
{'hello': 2, 'go': 14, 'sit': 6, 'line': 3, 'play': 0}
Как объясняет @Soviut, вы можете использовать функцию range()
со значением шага 2, чтобы напрямую перейти к слову. как я видел в вашем списке, у вас есть значения, хранящиеся в виде строки, поэтому я преобразовал их в целые числа.
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
data = {}
for i in range(0, len(lista), 2): # increase searching with step of 2 from 0 i.e. 0,2,4,...
if lista[i] in data.keys(): # this condition checks whether your element exist in dictionary key or not
data[lista[i]] = int(data[lista[i]]) + int(lista[i+1])
else:
data[lista[i]] = int(lista[i+1])
print(data)
Выход
{'hello': 2, 'go': 14, 'sit': 6, 'line': 3, 'play': 0}
Другое решение с использованием функций iter()
, itertools.zip_longest()
и itertools.groupby()
:
import itertools
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
it = iter(lista)
d = {k: sum(int(_[1]) for _ in g)
for k,g in itertools.groupby(sorted(itertools.zip_longest(it, it)), key=lambda x: x[0])}
print(d)
Выход:
{'line': 3, 'sit': 6, 'hello': 2, 'play': 0, 'go': 14}
Подсчет экземпляров уникальных ключей обычно возможен с помощью defaultdict
.
import collections as ct
lista = ['hello','2','go','5','sit','4','line','3','sit','2', 'go','9','play','0']
dd = ct.defaultdict(int)
iterable = iter(lista)
for word in iterable:
dd[word] += int(next(iterable))
dd
# defaultdict(int, {'go': 14, 'hello': 2, 'line': 3, 'play': 0, 'sit': 6})
Здесь мы инициализируем defaultdict
для принятия целых чисел. Мы создаем итератор списка, который создает генератор и позволяет нам вызывать next()
для него. Поскольку слово и значение встречаются в списке последовательными парами, мы будем выполнять итерацию и немедленно вызывать next()
, чтобы извлечь эти значения синхронно. Мы присваиваем эти элементы в виде (key, value)
пар defaultdict
, что ведет к подсчету.
Преобразуйте целые числа в строки, если это требуется:
{k: str(v) for k, v in dd.items()}
# {'go': '14', 'hello': '2', 'line': '3', 'play': '0', 'sit': '6'}
Альтернативным инструментом может быть Counter
(см. Ответ @ DexJ), который связан с этим типом defaultdict
. Фактически, Counter()
может заменить здесь defaultdict(int)
и вернуть тот же результат.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.