Как условно выделить элементы в понимании списка? - PullRequest
0 голосов
/ 15 января 2020

Я не смог найти ни одного примера, соответствующего моему варианту использования. Я все еще работаю в списках и словарях python.

Проблема:

all_cars = {'total_count': 3,'cars': [{'name': 'audi','model': 'S7'}, {'name': 'honda', 'model': 'accord'},{'name': 'jeep', 'model': 'wrangler'} ]} 

owners = {'users':[{'owner': 'Nick', 'car': 'audi'},{'owner': 'Jim', 'car': 'ford'},{'owner': 'Mike', 'car': 'mercedes'} ]} 


def duplicate(): 
   for c in all_cars['cars']: 
     if c['name'] == [c['users']for c in owners['users']]: 
        pass 
     else: 
        res = print(c['name']) 
   return res

output = ['honda', 'jeep', audi']

и

def duplicate(): 
   for c in all_cars['cars']: 
     if c['name'] == 'audi': 
        pass 
     else: 
        res = print(c['name']) 
   return res 

output - ['honda', 'jeep']

Я пытаюсь найти совпадающие значения в обоих словарях , используя понимание списка, затем возвращайте только несоответствующие значения.

Решение: Используя оператор «in» вместо «==», я смог сравнить значения между списками и пропустить дубликаты.

def duplicate(): 
   for c in all_cars['cars']: 
     if c['name'] in [c['users']for c in owners['users']]: 
        pass 
     else: 
        res = print(c['name']) 
   return res  

Ответы [ 3 ]

1 голос
/ 15 января 2020

Я бы просто собрал словарь всех данных владельца вместе:

    ownerData = { "Shaft" : {
              "carMake" : "Audi",
              "carModel" : "A8",
              "year" : "2015" },
         "JamesBond" : {
              "carMake" : "Aston",
              "carModel" : "DB8",
              "year" : "2012" },
         "JeffBezos" : {
              "carMake" : "Honda",
              "carModel" : "Accord"
              "year" : "1989"}
         }

Теперь вы можете выполнить l oop и запросить его примерно так:

    for o in ownerData:
         if "Audi" in o["carMake"]:
              print("Owner %s drives a %s %s %s" % (o, o["year"], o["carMake"], o["carModel"]))

Должен выдать:

    "Owner Shaft drives a 2015 Audi A8"

Таким образом, вы можете расширить свой набор данных для владельцев без создания нескольких списков.

0 голосов
/ 16 января 2020

ОК, исходя из ваших отзывов о вышеупомянутом решении, вот как я бы решил вашу проблему. Перетащите ваши общие элементы в списки, а затем используйте «set» для распечатки различий.

    all_cars = {'total_count': 3,'cars': [{'name': 'audi','model': 'S7'}, 
        {'name': 'honda', 'model': 'accord'},{'name': 'jeep', 'model': 'wrangler'} ]}

    owners = {'users':[{'owner': 'Nick', 'car': 'audi'},{'owner': 'Jim', 
        'car': 'ford'},{'owner': 'Mike', 'car': 'mercedes'} ]}

    allCarList = []
    ownerCarList = []
    for auto in all_cars['cars']:
        thisCar = auto['name']
        if thisCar not in allCarList:
            allCarList.append(thisCar)

    for o in owners['users']:
        thisCar = o['car']
        if thisCar not in ownerCarList:
            ownerCarList.append(thisCar)

    diff = list(set(allCarList) - set(ownerCarList))
    print(diff)

Я вставил это, запустил и получил следующий вывод:

    ['jeep', 'honda']

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

0 голосов
/ 15 января 2020

Чтобы ответить на вопрос в вашем заголовке, вы можете условно добавить элементы во время понимания списка, используя синтаксис [x for y in z if y == a], где y == a - любое необходимое условие - если условие оценивается как True, тогда элемент y будет добавлено в список, иначе не будет.

...