Как мне поместить несколько словарей в список

#python #list #dictionary

#python #Список #словарь

Вопрос:

Я создал словарь:

 new_list = {}
  

что дает,

     {'date': '13/09/2020', 'day': '13', 'month': '9', 'year': '2020', 'cases': '35', 'deaths': '0', 
    'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 
    'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.3090878'}
    {'date': '12/9/20', 'day': '12', 'month': '9', 'year': '2020', 'cases': '34', 'deaths': '0', 
    'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 
    'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.22496971'}
    {'date': '11/9/20', 'day': '11', 'month': '9', 'year': '2020', 'cases': '28', 'deaths': '0', 
    'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 
    'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.16450983'}
  

Но теперь я хочу добавить этот словарь в список

 dataset= [new_list] 
  

что дает,

 [{'date': '13/09/2020', 'day': '13', 'month': '9', 'year': '2020', 'cases': '35', 'deaths': '0', 'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.3090878'}]
[{'date': '12/9/20', 'day': '12', 'month': '9', 'year': '2020', 'cases': '34', 'deaths': '0', 'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.22496971'}]
[{'date': '11/9/20', 'day': '11', 'month': '9', 'year': '2020', 'cases': '28', 'deaths': '0', 'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.16450983'}]
  

Однако я пытаюсь получить результат как (так что только «[]» в начале и в конце), потому что тогда я могу сделать dataset [0: 2] (в противном случае это даст мне объект ‘Nonetype’, не подлежащий подписке), и он даст только первые два словаря

 [{'date': '13/09/2020', 'day': '13', 'month': '9', 'year': '2020', 'cases': '35', 'deaths': '0', 'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.3090878'},
{'date': '12/9/20', 'day': '12', 'month': '9', 'year': '2020', 'cases': '34', 'deaths': '0', 'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.22496971'},
{'date': '11/9/20', 'day': '11', 'month': '9', 'year': '2020', 'cases': '28', 'deaths': '0', 'countriesAndTerritories': 'Afghanistan', 'countryTerritoryId': 'AF', 'countryTerritoryCode': 'AFG', 'population2019': '38041757', 'continent': 'Asia', 'cumulativeper1000002Weeks': '1.16450983'}]
  

Мой код выглядит следующим образом:

 import csv
def read_dataset() -> List[Dict[str,str]]:
    dataset = []
    with open('covid-19.csv', 'r') as file:
        reader = csv.reader(file)
        no_head = next(reader, None)
       
        for row in reader:
            lst = [
                'date',
                'day', 
                'month', 
                'year',
                'cases', 
                'deaths', 
                'countriesAndTerritories', 
                'countryTerritoryId', 
                'countryTerritoryCode', 
                'population2019', 
                'continent',
                'cumulativeper1000002Weeks',
            ]
            new_list = {}
            for x in range(len(lst)):
                new_list[lst[x]] = row[x]
            dataset= [new_list]
            #print(dataset)
            
dataset = read_dataset()
print(dataset[0:2])
  

Комментарии:

1. Точно так же, как вы бы поместили несколько словарей в список.

Ответ №1:

 import csv
def read_dataset() -> List[Dict[str,str]]:
    dataset = []
    with open('covid-19.csv', 'r') as file:
        reader = csv.reader(file)
        no_head = next(reader, None)
    
        for row in reader:
            lst = [
                'date',
                'day', 
                'month', 
                'year',
                'cases', 
                'deaths', 
                'countriesAndTerritories', 
                'countryTerritoryId', 
                'countryTerritoryCode', 
                'population2019', 
                'continent',
                'cumulativeper1000002Weeks',
            ]
            new_list = {}
            for x in range(len(lst)):
                new_list[lst[x]] = row[x]
            dataset.append(new_list)
            #print(dataset)
    return dataset
            
dataset = read_dataset()
print(dataset[0:2])
  

Разница в том, что вы должны использовать:

 dataset.append(new_list)
  

функция, которая добавляет в конце new_list (что является dict, немного сбивает с толку, обратите внимание на имена переменных!)

Комментарии:

1. Я знаю, я повторно использовал код @Bows, чтобы сделать его более понятным для него.

2. Было бы неплохо исправить именование и объяснить, почему вы это сделали в ответе.

3. Вы можете использовать dict() with zip() для замены for цикла: dict(zip(lst, row[:len(lst)]))

4. Да, именование было моим недостатком, следовало уделить больше внимания. Новый список работает, однако print(dataset[0:2]) выдает ошибку типа: объект ‘NoneType’ не подлежит подписке, и я не уверен, как это исправить. Редактировать: я должен был использовать return, спасибо за ответы

5. Вы пропускаете оператор return, я добавляю его в ответ!