кортеж с dict в список с модификацией элемента - PullRequest
1 голос
/ 20 марта 2020

Учитывая кортеж, как показано ниже,

tpl = ('abc', {'a': 1, 'b': 2})

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

Ожидаемый результат

['abc', 'a: 1', 'b: 2']

Tuple can быть преобразованным в список с помощью списка вызовов (tpl)

Часть, в которой dict key:val преобразуется в key + " : " + val, может быть выполнена следующим образом:

[k + " : " + v for k, v in dict.items()]

Я думаю, что часть выборочного вызова вышеуказанной манипуляции должна быть сделана путем проверки типа (только для dict) - нужна некоторая помощь, чтобы получить полное решение.

Также как отдельная проблема, есть ли способ сделать это на месте?

Ответы [ 4 ]

1 голос
/ 20 марта 2020

Решение с использованием списка-понимания.

tpl = ('abc', {'a': 1, 'b': 2})
answer = [
  x for dict_or_str in tpl for x in 
  ( 
    [f"{k}: {v}" for k, v in dict_or_str.items()] 
    if isinstance(dict_or_str, dict)
    else [dict_or_str]
  )
]
print(answer)

Вывод

['abc', 'a: 1', 'b: 2']
1 голос
/ 20 марта 2020

Другая возможность заключается в использовании filter, например:

tpl = ('abc', {'a': 1, 'b': 2})
iter = filter(lambda d: type(d) == dict , list(tpl))
sol = list(filter(lambda d: type(d) != dict , list(tpl)))

for elem in iter:
    for k, v in elem.items():
        sol.append("{:}: {:}".format(k, v))

print(sol)
#['abc', 'a: 1', 'b: 2']
1 голос
/ 20 марта 2020

Для точного решения этой проблемы вам придется позаботиться о спецификациях c dtypes, содержащихся в кортежах, и обращаться с ними индивидуально. Таким образом, используя isinstance и добавляя элементы с соответствующими логами c. Для общего примера, что-то вроде следующего должно сделать:

l= []
for i in tpl:
    if isinstance(i, str):
        l.append(i)
    elif isinstance(i, dict):
        for k,v in i.items():
            l.append(f'{k}: {str(v)}')

print(l)
# ['abc', 'a: 1', 'b: 2']
0 голосов
/ 20 марта 2020

Решение

Вот ответ в одну строку. Он использует

  • condensed for-loop
  • condensed if-else
  • list-comprehension
# tpl = ('abc', {'a': 1, 'b': 2})
vals = []
for e in tpl: vals.append(e) if not isinstance(e, dict) else vals.extend([f'{k}: {v}' for k,v in e.items()])

print(vals)

Выход :

['abc', 'a: 1', 'b: 2']

Расширенная версия кода с дополнительными комментариями

А вот и многострочная версия того же кода.

vals = [] # create empty list
for e in tpl: 
    # iterate over the elements in the tuple
    if not isinstance(e, dict):
        # WHEN an element is NOT a dict, 
        # APPEND non-dict elements to the list: vals
        vals.append(e) 
    else: 
        # WHEN an element is a dict, 
        # CREATE a list of elements, where, each 
        #   created-element is of the form: 
        #     f'{key}: {value}'
        # AND
        # ADD the list of multiple elements to vals
        # USING list.extend() method.
        vals.extend([f'{k}: {v}' for k,v in e.items()])

print(vals)
...