Как получить доступ к словарю в элементе списка словарей в Python?

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть словарь, значения которого представляют собой список dictionary. Например —

 dj={'101': [{'Name': 'vamc'}, {'House': 'yes'}, {'married': 'yes'}, {'car': '1'}], '102': [{'Name': 'suresh'}, {'House': 'no'}, {'married': 'yes'}, {'car': '0'}]}
  

Я хотел бы получить доступ к атрибуту car с идентификатором = ‘102’. Я попробовал что-то подобное, чтобы решить свою проблему.

 li=[]
dj={}

def indec():
    di1={}
    di2={}
    di3={}
    di4={}
    di1['Name']=input("Enter the Name")
    di2['House']=input("Enter the House status")
    di3['married']=input("Enter the married status")
    di4['car']=input("Enter no of cars")
    li=[di1,di2,di3,di4]
    return li


x=int(input("Enter How many values:"))
for i in range(x):
    y=input("Enter id")
    dj[y]=indec()

id=input("Enter the id whose no of cars do u want:")
print("No of cars are:",dj[id['car']])
  

Любое более простое решение было бы высоко оценено.

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

1. Вы слышали о нашем господе и спасителе, объектно-ориентированном программировании?

2. Добавлен пример ООП @MaximGi

3. Привет, проверьте, помог ли мой ответ вам в вашем вопросе? @SureshReshu 🙂

Ответ №1:

Объектно-ориентированный подход, упомянутый @MaximGi

 #Class to encapsulate person
class Person:

  def __init__(self, id, name, house, married, car):
    self.id = id
    self.name = name
    self.house = house
    self.married = married
    self.car = car


li=[]

#Get input values from user
def indec():

    name=input("Enter the Name")
    house=input("Enter the House status")
    married=input("Enter the married status")
    car=input("Enter no of cars")
    return name, house, married, car

#In a for loop, create a person object and append it to list
x=int(input("Enter How many values:"))
for i in range(x):
    y=input("Enter id")
    p = Person(y, *indec())
    li.append(p)


id=input("Enter the id whose no of cars do u want:")
#Loop through person list and print car attribute for which the id matches
for p in li:
  if p.id == id:
    print("No of cars are:",p.car)
  

Вывод получается в виде

 Enter How many values:2
Enter id101
Enter the Namevamc
Enter the House statusyes
Enter the married statusyes
Enter no of cars1
Enter id102
Enter the Namesuresh
Enter the House statusyes
Enter the married statusno
Enter no of cars0
Enter the id whose no of cars do u want:102
No of cars are: 0
  

Ответ №2:

Простой способ, как упоминал @MaximGi, использовать ООП. Это облегчило бы вашу жизнь.

Но если вы настаиваете на решении этой проблемы без ООП, вы можете преобразовать список словарей в единый словарь, поскольку это атрибут одного человека.

 def convert_to_single_record(attributes):
    record = {}
    for attribute in attributes:
        record.update(attribute)
    return record

customer_record = {'101': [{'Name': 'vamc'},
                           {'House': 'yes'},
                           {'married': 'yes'},
                           {'car': '1'}],
                   '102': [{'Name': 'suresh'},
                           {'House': 'no'},
                           {'married': 'yes'},
                           {'car': '0'}]}

records = {}
for id, attributes in customer_record.items():
    records[id] = convert_to_single_record(attributes)

print(records['102']['car'])
  

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

1. Для чего назначена переменная ‘customer_record’?

Ответ №3:

как насчет

 to_search = 'car'
index = '102'

dj={'101': [{'Name': 'vamc'}, {'House': 'yes'}, {'married': 'yes'}, {'car': '1'}], '102': [{'Name': 'suresh'}, {'House': 'no'}, {'married': 'yes'}, {'car': '0'}]}

result_list = [ val for val in dj[index] if to_search in val ]

print result_list[0]
  

Надеюсь, это поможет.