2016-12-05 3 views
2

Как преобразовать приведенные ниже значения вложенных словарей в одну строку?Преобразование значений вложенных словарей в одну строку

data = {'people': {'first': {'fname': 'P1', 'lname': 'L1'}, 'second': { 'fname': 'P2', 'lname': 'L2'}}} 

Выход должен быть P1 L1, P2 L2

Вот мой текущий код:

print ', '.join("%s %s" % (data['people'][person].get('fname'), data['people'][person].get('lname')) for person in data['people']) 

Является ли это эффективным способом для более широкого набора для элементов в людей Сыроватского? Если не как это улучшить?

ответ

2

Вы можете сделать ваше выражение немного не доходя только зацикливание только значений и использование именованного поля в format string (акцент должен быть более читабельным):

>>> print ', '.join("{fname} {lname}".format(**p) for p in data['people'].values()) 
P2 L2, P1 L1 

В Python 3.2+ это также может быть сделано с помощью str.format_map:

>>> print (', '.join("{fname} {lname}".format_map(p) for p in data['people'].values())) 
P1 L1, P2 L2 

Если ключи fname или lname могут отсутствовать отдельные из dicts тогда вы могли бы сделать что-то вроде этого:

def get_values(dct, keys): 
    return (dct.get(k) for k in keys) 
... 
>>> keys = ('fname', 'lname') 
>>> print ', '.join("{} {}".format(*get_values(p, keys)) for p in data['people'].values()) 
P2 L2, P1 L1 

  • Если число значений велико, то замените values() на itervalues(). В Python 3 используйте только values().
  • У диктов нет указанного порядка, поэтому вы не можете ожидать, что выход будет P1 L1, P2 L2 здесь.
+0

Не общее решение. – helloV

+0

@helloV Если текущий код OP работает для них, то он не видит, почему здесь требуется общее решение. –

+0

добавил отсортированный, 'print ',' .join (" {fname} {lname} ". Format (** p) для p в отсортированном (data ['people']. Values ​​()))' даст 'P1 L1 , P2 L2' – Skycc

-1
data = {'people': {'first': {'fname': 'P1', 'lname': 'L1'}, 'second': { 'fname': 'P2', 'lname': 'L2'}}} 


def myprint(d): 
    for k, v in d.iteritems(): 
    if isinstance(v, dict): 
     myprint(v) 
    else: 
     print "{0} : {1}".format(k, v) 

myprint(data) 
+0

Я думаю, что OP хочет только значения вложенного dict. Но он может настроить ваше решение, чтобы получить ответ, который ему нужен. – roymustang86

+0

Мне нужен мой выход, как этот P1 L1, P2 L2. Не нужно печатать отдельно. – Rookie

1

Ваша структура данных является рекурсивным, так что вы будете нуждаться в рекурсивную функцию, чтобы получить их

def get_values(data): 
    values = [] 
    for k, v in data.items(): 
     if isinstance(v, dict): 
      values.extend(get_values(v)) 
     else: 
      values.append(v) 
    return values 
0
result = list() 
for person in data["people"]: 
    for val in data["people"][person].values(): 
     result.append(val) 
    result.append(", ") 
result.pop() 
print(' '.join(result)) 

или

result = list() 
for person in data["people"]: 
    result.append(data["people"][person]["fname"]) 
    result.append(data["people"][person]["lname"]) 
    result.append(", ") 
result.pop() 
print(' '.join(result)) 
0
one = data['people']['second'].values() 
two = data['people']['first'].values() 

three = one + two 
three.reverse() 


for each in three: 
    print each, 

Я надеюсь, что это то, что вы ищете.

Смежные вопросы