Как извлечь все значения по тегу внутри значения словаря? - PullRequest
0 голосов
/ 18 октября 2019

У меня есть словарь с 500 000 записей, который выглядит следующим образом:

result = 

'182720808': {'transaction_id': '182720808', 'product_amount': '2.4', 'user_invoice_date': '2018-10-25', 'tracking_code': '30643198', 'from_country': 'FR', 'to_country': 'FR', 'package_type_id': '10', 'shipping_label_created': '2018-10-13 21', '14': '35', 'amount': '3.23'},
'280284691': {'transaction_id': '280284691', 'product_amount': '2.4', 'user_invoice_date': '2019-03-16', 'tracking_code': '42891295', 'from_country': 'FR', 'to_country': 'FR', 'package_type_id': '10', 'shipping_label_created': '2019-03-08 09', '04': '53', 'amount': '2.9'}

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

Я пробовал следующее

all_product_amounts = []
for item in results:
   all_product_amounts.append(result[result.keys())

, но это не делает работу. Я новичок в Python и хотел бы стать лучше с работой над словарями.

Ожидаемый вывод будет иметь список для каждого тега внутри значений:

all_product_amounts = [2.4, 2.4]
all_package_type_id = [10, 10]
...

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

это похоже на то, что вы хотите

all_product_amounts = [result[key]['product_amount'] for key in result]
all_user_invoice_dates = [result[key]['user_invoice_date'] for key in result]
0 голосов
/ 18 октября 2019

Хотя лучшим инструментом для этого, безусловно, является Pandas , более гибкий, основанный на dict подход, чем уже предложенный, извлекает всю соответствующую информацию:

def to_dict_of_lists(x):
    return {
        k: [d[k] for d in x.values()]
        for k in x[next(iter(x.keys()))].keys()
        if all(k in x[y] for y in x)}


x = {1: {'a': 1, 'b': 2}, 2: {'a': 3, 'b': 4}}
print(to_dict_of_lists(x))
# {'a': [1, 3], 'b': [2, 4]}


result = {
'182720808': {'transaction_id': '182720808', 'product_amount': '2.4', 'user_invoice_date': '2018-10-25', 'tracking_code': '30643198', 'from_country': 'FR', 'to_country': 'FR', 'package_type_id': '10', 'shipping_label_created': '2018-10-13 21', '14': '35', 'amount': '3.23'},
'280284691': {'transaction_id': '280284691', 'product_amount': '2.4', 'user_invoice_date': '2019-03-16', 'tracking_code': '42891295', 'from_country': 'FR', 'to_country': 'FR', 'package_type_id': '10', 'shipping_label_created': '2019-03-08 09', '04': '53', 'amount': '2.9'}
}
y = to_dict_of_lists(result)
print(y)
# {'transaction_id': ['182720808', '280284691'], 'product_amount': ['2.4', '2.4'], 'user_invoice_date': ['2018-10-25', '2019-03-16'], 'tracking_code': ['30643198', '42891295'], 'from_country': ['FR', 'FR'], 'to_country': ['FR', 'FR'], 'package_type_id': ['10', '10'], 'shipping_label_created': ['2018-10-13 21', '2019-03-08 09'], 'amount': ['3.23', '2.9']}
print(y['product_amount'])
# ['2.4', '2.4']

Другой подход заключается вчтобы извлечь данный список по требованию:

def extract_by_key(x, key):
    return [d[key] for d in x.values() if key in d]


print(extract_by_key(result, 'product_amount'))
# ['2.4', '2.4']
0 голосов
/ 18 октября 2019

Вот одно из решений. Результатом будет словарь с ключами типа product_amount, transaction_id, ..., а значения - это списки, содержащие все данные для соответствующего ключа.

mydict = {
  '182720808': {
    'transaction_id': '182720808',
    'product_amount': '2.4',
    'user_invoice_date': '2018-10-25',
    'tracking_code': '30643198',
    'from_country': 'FR',
    'to_country': 'FR',
    'package_type_id': '10',
    'shipping_label_created': '2018-10-13 21',
    '14': '35',
    'amount': '3.23'
  },
  '280284691': {
    'transaction_id': '280284691',
    'product_amount': '2.4',
    'user_invoice_date': '2019-03-16',
    'tracking_code': '42891295',
    'from_country': 'FR',
    'to_country': 'FR',
    'package_type_id': '10',
    'shipping_label_created': '2019-03-08 09',
    '04': '53',
    'amount': '2.9'
  }
}

result = {}
for entry in mydict.values():
    for key, value in entry.items():
        if key not in result.keys():
            result[key] = [value]
        else:
            result[key].append(value)

print(result)

Результат:

{
  'transaction_id': ['182720808', '280284691'],
  'product_amount': ['2.4', '2.4'],
  'user_invoice_date': ['2018-10-25', '2019-03-16'],
  'tracking_code': ['30643198', '42891295'],
  'from_country': ['FR', 'FR'],
  'to_country': ['FR', 'FR'],
  'package_type_id': ['10', '10'],
  'shipping_label_created': ['2018-10-13 21', '2019-03-08 09'],
  '14': ['35'],
  'amount': ['3.23', '2.9'],
  '04': ['53']
}

С этим вы можете использовать result['product_amount'] (или любой другой действительный ключ), чтобы получить список, который вам нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...