Замена элементов списка словарей по ключу на числа из этих элементов
Есть словарь вида:
rows = [{'customer': 1, 'item': '10 0 apple', 'item2': '3 milk', 'age': '24'},
{'customer': 2, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
{'customer': 3, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
{'customer': 4, 'item': '4 0 0 cats', 'item2': '76 mango', 'age': '25'}]
Нужно вытащить из его элементов по ключу "item" числа и записать их вместо элементов. Если в элементе содержатся числа через пробелы или иные символы, то их необходимо слить в одно число. Например, из элемента '10 0 apple' должно получиться '100', '4 0 0 cats' - '400' и т.д.
Мой вариант кода вытаскивает числа из элементов, но не объединяет и не заменяет на сам элемент:
count = 0
for element in rows: # Определяем количество словарей в списке
count += 1
for i in range(0, count+1): # Перебираем каждый словарь списка
numbers = []
for j in rows[i]['item'].split(' '): # В каждом словаре сплитим элемент с ключом "item"
try:
int(j)
numbers.append(j)
except:
pass
print(numbers)
Ответы (4 шт):
Автор решения: Михаил Муругов
→ Ссылка
def get_int_from_string(string): # Получение числа из строки
value = ''.join(filter(str.isdigit, string)) # "Забирание" всех цифр из строки и объединение в одну строку
return int(value) # Возврат приведённого к типу int
# Исходные данные
rows = [{'customer': 1, 'item': '10 0 apple', 'item2': '3 milk', 'age': '24'},
{'customer': 2, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
{'customer': 3, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
{'customer': 4, 'item': '4 0 0 cats', 'item2': '76 mango', 'age': '25'}]
numbers = [] # Куда будет складываться результат
for row in rows:
# Для каждого элемента из rows получаем нужное число и кладём в результирующий список
numbers.append(get_int_from_string(row['item']))
for row, value in zip(rows, numbers):
print(row['item'], value, sep=' | ') # Вывод для наглядности
Если хотите заменять прям в rows, то:
for i, row in enumerate(rows):
rows[i] = get_int_from_string(row['item'])
Автор решения: Andrew Tim
→ Ссылка
import re
rows = [{'customer': 1, 'item1': '10 9 apple', 'item2': '3 milk', 'age': '24'},
{'customer': 2, 'item1': '25 water', 'item2': '2 orange', 'age': '23'},
{'customer': 3, 'item1': '25 water 8', 'item2': '2 orange', 'age': '23'},
{'customer': 4, 'item1': '4 0 0 cats', 'item2': '76 mango', 'age': '25'}]
for row in rows:
item = row['item1'] # Получаем нужную строку
value = ''.join(re.findall(r'\d+', item)) # Достаём из неё все цифры и объединяем через пустую строку
value = int(value) # Приводим к типу int
#print(value) # Вывод для наглядности
del row['item1']
row['item1'] = value
print(rows)
Автор решения: Jack_oS
→ Ссылка
rows = [
{'customer': 1, 'item': '10 0 apple', 'item2': '3 milk', 'age': '24'},
{'customer': 2, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
{'customer': 3, 'item': '25 water', 'item2': '2 orange', 'age': '23'},
{'customer': 4, 'item': '4 0 0 cats', 'item2': '76 mango', 'age': '25'}
]
Обойтите элементы списка и измените значение ключа item:
for r in rows:
r['item'] = ''.join(i for i in r['item'] if i.isdigit())
Теперь в rows:
>>> rows
[
{'customer': 1, 'item': '100', 'item2': '3 milk', 'age': '24'},
{'customer': 2, 'item': '25', 'item2': '2 orange', 'age': '23'},
{'customer': 3, 'item': '25', 'item2': '2 orange', 'age': '23'},
{'customer': 4, 'item': '400', 'item2': '76 mango', 'age': '25'}
]
Оставит значение пустой строкой, если не найдет цифр...
Автор решения: MaxU
→ Ссылка
решение с использованием модуля Pandas:
import pandas as pd
df = pd.DataFrame(rows)
df["item"] = df["item"].str.replace(r"\D", "")
результат:
In [47]: df
Out[47]:
customer item item2 age
0 1 100 3 milk 24
1 2 25 2 orange 23
2 3 25 2 orange 23
3 4 400 76 mango 25
если нужен словарь:
In [48]: res = df.to_dict("records")
In [49]: res
Out[49]:
[{'customer': 1, 'item': '100', 'item2': '3 milk', 'age': '24'},
{'customer': 2, 'item': '25', 'item2': '2 orange', 'age': '23'},
{'customer': 3, 'item': '25', 'item2': '2 orange', 'age': '23'},
{'customer': 4, 'item': '400', 'item2': '76 mango', 'age': '25'}]