Список словаря к списку кортежей для l oop in python - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь создать условное выражение для l oop для списка словарей.

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

CLIENTS_EXAMPLE = [
    {
        "first-name": "Elsa",
        "last-name": "Frost",
        "title": "Princess",
        "address": "33 Castle Street, London",
        "loyalty-program": "Gold",
    },
    {
        "first-name": "Anna",
        "last-name": "Frost",
        "title": "Princess",
        "address": "34 Castle Street, London",
        "loyalty-program": "Platinum",
    },
{
        "first-name": "Ben",
        "last-name": "Frost",
        "middle-name": "john",
        "title": "Prince",
        "address": "36a Castle Street, London",
        "loyalty-program": "Platinum",
    },

    {
        "first-name": "Harry",
        "middle-name": "Harold",
        "last-name": "Hare",
        "title": "Mr",
        "email-address": "harry.harold@hare.name",
        "loyalty-program": "Silver",
    },
    {
        "first-name": "Leonnie",
        "last-name": "Lion",
        "title": "Mrs",
        "loyalty-program": "Silver",
    },
]

Я должен распечатать людей с известным адресом (не адрес электронной почты) и распечатать их первый, средний (если имеется) и фамилия с адресом.

Вывод должен выглядеть следующим образом:

[('Princess Elsa Frost', '33 Castle Street, London'),('Prince Ben John Frost', '36a Castle Street, London') ... etc]

Мне удалось отфильтровать элементы и добавить их в список кортежей:


def process_clients(segment):

   new_list = []
   new_tuple =()
      for x in segment: #separates the dictionary from the list
         if "address" in x:
             if "middle-name" in x:
                new_tuple += (x["title"] + " " + x["first-name"] + " " + x["middle-name"] + " " + x["last-name"]), (x["address"])
             else:
                new_tuple += (x["title"] + " " + x["first-name"] + " "  + x["last-name"]), (x["address"])
                new_list.append(new_tuple)

       print(new_list)

process_clients(CLIENTS_EXAMPLE)

Что я get - это следующий вывод:


[('Princess Elsa Frost', '33 Castle Street, London'), ('Princess Elsa Frost', '33 Castle Street, London', 'Princess Anna Frost', '34 Castle Street, London'), ('Princess Elsa Frost', '33 Castle Street, London', 'Princess Anna Frost', '34 Castle Street, London', 'Prince Ben john Frost', '36a Castle Street, London')]

Как избежать повторений в кортежах?

Спасибо

Ответы [ 2 ]

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

Вы создаете новый кортеж и затем добавляете к нему, вам просто нужно переместить эту new_tuple инициализацию внутри для l oop

for x in segment:
    new_tuple =()

Вы также можете использовать понимание списка

[("{} {} {}{}".format(
    x["title"],
    x["first-name"],
    x["middle-name"] + " " if "middle-name" in x else "",
    x["last-name"])), x["address"]) for x in segment]
0 голосов
/ 24 января 2020

Как избежать повторений в кортежах?

Не использовать +=? Когда вы пишете new_tuple += ..., это объединит существующий new_tuple и все, что справа, и установите его как новый new_tuple. Итак, вы начинаете с (), затем добавляете Альфреда, чтобы вы получили ('Alfred',), добавляете это к списку, затем вы добавляете Бренду и получаете ('Alfred', 'Brenda') и добавляете , который , в список, et c ...

Вы можете просто полностью удалить new_tuple и напрямую добавить каждый литерал кортежа в свой выходной список.

...