Home > database >  Converting a list of dictionaries to a list by using certain keys
Converting a list of dictionaries to a list by using certain keys

Time:10-06

I have list of dictionaries which the dictionary size (number of keys) is not constant. Here is an example:

data = [{'t': 1633098324445950024,
         'y': 1633098324445929497,
         'q': 1636226,
         'i': '57337',
         'x': 12,
         's': 15,
         'c': [14, 37, 41],
         'p': 139.55,
         'z': 3},
        {'t': 1633098324445958000,
         'y': 1633098324445929497,
         'q': 1636229,
         'i': '57340',
         'x': 12,
         's': 100,
         'c': [14, 41],
         'p': 139.55,
         'z': 3},
        {'t': 1633098324445958498,
         'y': 1633098324445594112,
         'q': 1636230,
         'i': '31895',
         'x': 11,
         's': 60,
         'c': [14, 37, 41],
         'p': 139.55,
         'z': 3},
        {'t': 1633098324446013523,
         'y': 1633098324445649152,
         'q': 1636231,
         'i': '31896',
         'x': 11,
         's': 52,
         'c': [14, 37, 41],
         'p': 139.55,
         'z': 3},
        {'t': 1633098324472392943,
         'y': 1633098324472133407,
         'q': 1636256,
         'i': '3417',
         'x': 15,
         's': 100,
         'p': 139.555,
         'z': 3},
        {'t': 1633098324478972256,
         'y': 1633098324478000000,
         'f': 1633098324478949693,
         'q': 1636260,
         'i': '58051',
         'x': 4,
         'r': 12,
         's': 100,
         'p': 139.555,
         'z': 3}]

As it is in the sample each dictionary has different length and they do not necessarily have the same keys. I need to extract certain elements based on the key. I am using [(d['t'],d['p'],d['s']) for d in data] and the results looks like this:

[(1633098324445950024, 139.55, 15),
 (1633098324445958000, 139.55, 100),
 (1633098324445958498, 139.55, 60),
 (1633098324446013523, 139.55, 52),
 (1633098324472392943, 139.555, 100),
 (1633098324478972256, 139.555, 100)]

But I need to have values with 'c' key and when I run the following I got KeyError:

[(d['t'],d['p'],d['s'],d['c']) for d in data]

Traceback (most recent call last):

  File "<ipython-input-108-8533763f150e>", line 1, in <module>
    [(d['t'],d['p'],d['s'],d['c']) for d in data]

  File "<ipython-input-108-8533763f150e>", line 1, in <listcomp>
    [(d['t'],d['p'],d['s'],d['c']) for d in data]

KeyError: 'c'

CodePudding user response:

One approach:

res = [(d['t'], d['p'], d['s'])   ((d['c'],) if 'c' in d else tuple()) for d in data]
pprint.pprint(res)

Output

[(1633098324445950024, 139.55, 15, [14, 37, 41]),
 (1633098324445958000, 139.55, 100, [14, 41]),
 (1633098324445958498, 139.55, 60, [14, 37, 41]),
 (1633098324446013523, 139.55, 52, [14, 37, 41]),
 (1633098324472392943, 139.555, 100),
 (1633098324478972256, 139.555, 100)]

CodePudding user response:

Why don't you try this:

value_list = [(d.get('t', ''), d.get('p', ''), d.get('s', ''), d.get('c', [])) for d in data]
print(value_list)

Output:

[(1633098324445950024, 139.55, 15, [14, 37, 41]),
(1633098324445958000, 139.55, 100, [14, 41]),
(1633098324445958498, 139.55, 60, [14, 37, 41]),
(1633098324446013523, 139.55, 52, [14, 37, 41]),
(1633098324472392943, 139.555, 100, []),
(1633098324478972256, 139.555, 100, [])]

CodePudding user response:

def convert_to_list(list_of_dicts, keys):
    """
    Convert a list of dictionaries to a list by using certain keys.

    :param list_of_dicts: list of dictionaries
    :param keys: list of keys
    :return: list
    """
    return [{key: dic[key] for key in keys} for dic in list_of_dicts]


if __name__ == '__main__':
    list_of_dicts = [{'name': 'John', 'age': 21}, {'name': 'Mark', 'age': 25}]
    keys = ['name', 'age']
    print(convert_to_list(list_of_dicts, keys))
  • Related