Удалить запятую (,) из номера строки в списке словарей - PullRequest
1 голос
/ 06 мая 2020

У меня есть список словаря :: Образцы данных :: Вот так у меня n данных.

datas = [{"_id":"1234as", "Total students":"123,321", "TotalPresent":"321,345"}, 
    {"_id":"1234asas","TotalStudents":"343,431","TotalPresent":"541,656"}]

Я пробовал

for data in datas:
    for i in data.values():
        re.sub('[^A-Za-z0-9]+', '', i)
    datas.append(i)

Я просто хочу удалить запятую (,) из TotalStudents и TotalPresent и заменить значение в данных.

Edit 1

В моем списке словаря у меня также есть значение как ::

datas = [{"_id":"1234as","Totalstudents":"123,321","TotalPresent":"321,345"},      
        {"_id":"1234asas","TotalStudents":"343,431","TotalPresent":"541,656"},
         {"_id":"9934 asas","TotalStudents":"NA","TotalPresent":""}]

Здесь в ключе значение TotalStudents равно «NA», а TotalPresent - «». Есть ли способ заменить «NA» или «» на «0».

Ответы [ 3 ]

1 голос
/ 06 мая 2020

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

import re

datas = [{"_id": "1234as", "Total Students": "123,321", "TotalPresent": "321,345"},
         {"_id": "1234asas", "TotalStudents": "343,431", "TotalPresent": "541,656"}]


for data in datas:
    for key, value in data.items():
        print(key, value)
        value = re.sub('[^A-Za-z0-9]+', '', value)
        data[key] = value

print(datas)

Результат

_id 1234as
Total Students 123,321
TotalPresent 321,345
_id 1234asas
TotalStudents 343,431
TotalPresent 541,656

[{'_id': '1234as', 'Total Students': '123321', 'TotalPresent': '321345'}, 
 {'_id': '1234asas', 'TotalStudents': '343431', 'TotalPresent': '541656'}]

Это способ заставить ваш код работать и, таким образом, всегда заменять все значения. При необходимости вам нужно добавить свои собственные проверки, чтобы сделать его умнее.

EDIT

Чтобы уловить значения «NA» и «», я добавил несколько операторов if. Это просто и похоже на ваш собственный код.

import re

datas = [{"_id":"1234as","TotalStudents":"123,321","TotalPresent":"321,345"},
        {"_id":"1234asas","TotalStudents":"343,431","TotalPresent":"541,656"},
         {"_id":"9934 asas","TotalStudents":"NA","TotalPresent":""}]


for data in datas:
    print(data)
    for key, value in data.items():

        if key == "TotalStudents":
            if value == "NA":
                value =  "0"
            else:
                value = re.sub('[^A-Za-z0-9]+', '', value)
        elif key == "TotalPresent":
            if not value:
                value = "0"
            else:
                value = re.sub('[^A-Za-z0-9]+', '', value)

        data[key] = value

print()
for data in datas:
    print(data)

Результат

{'_id': '1234as', 'TotalStudents': '123321', 'TotalPresent': '321345'}
{'_id': '1234asas', 'TotalStudents': '343431', 'TotalPresent': '541656'}
{'_id': '9934 asas', 'TotalStudents': '0', 'TotalPresent': '0'}

Чтобы сделать код более эффективным, вы можете поместить новые значения прямо в данные. В этом случае вы больше не заменяете "_id" его собственным значением.

import re

datas = [{"_id":"1234as","TotalStudents":"123,321","TotalPresent":"321,345"},
        {"_id":"1234asas","TotalStudents":"343,431","TotalPresent":"541,656"},
         {"_id":"9934 asas","TotalStudents":"NA","TotalPresent":""}]


for data in datas:
    print(data)
    for key, value in data.items():

        if key == "TotalStudents":
            if value == "NA":
                data[key] = "0"
            else:
                data[key] = re.sub('[^A-Za-z0-9]+', '', value)
        elif key == "TotalPresent":
            if not value:
                data[key] = "0"
            else:
                data[key] = re.sub('[^A-Za-z0-9]+', '', value)

print()
for data in datas:
    print(data)
1 голос
/ 06 мая 2020

Если вы хотите заменить значения ключей c, убедитесь, что ключи такие же, потому что первый dict в вашем примере имеет Total Students, а второй - TotalStudents.

Попробуйте это:

datas = [{"_id": "1234as", "Total Students": "123,321", "TotalPresent": "321,345"},
         {"_id": "1234asas", "Total Students": "343,431", "TotalPresent": "541,656"}]

for d in datas:
    d["Total Students"] = d["Total Students"].replace(",", "")
    d["TotalPresent"] = d["TotalPresent"].replace(",", "")

print(datas)
# output: [{'_id': '1234as', 'Total Students': '123321', 'TotalPresent': '321345'}, {'_id': '1234asas', 'Total Students': '343431', 'TotalPresent': '541656'}]

Если вы хотите заменить запятые во всех ключах, вы можете попробовать (но помните, что в этом случае все значения вашего dict должны быть строками):

datas = [{"_id": "1234as", "Total Students": "123,321", "TotalPresent": "321,345"},
         {"_id": "1234asas", "Total Students": "343,431", "TotalPresent": "541,656"}]

for d in datas:
    for k in d:
        d[k] = d[k].replace(",", "")
0 голосов
/ 06 мая 2020

re.sub не работает на месте - он возвращает измененный str. В более общем смысле, поскольку str s являются неизменяемыми функциями, обрабатывающими их, они не работают на месте. Решение с использованием re.sub может выглядеть следующим образом:

import re
datas = [{"_id":"1234as","Total Students":"123,321","TotalPresent":"321,345"},
{"_id":"1234asas","TotalStudents":"343,431","TotalPresent":"541,656"}]
cleandatas = []
for data in datas:
    cleandatas.append({k:re.sub('[^A-Za-z0-9]+', '', v) for k,v in data.items()})
print(cleandatas)

Вывод:

[{'_id': '1234as', 'Total Students': '123321', 'TotalPresent': '321345'}, {'_id': '1234asas', 'TotalStudents': '343431', 'TotalPresent': '541656'}]

Я использовал dict -понимание для создания нового очищенного dict s

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...