Как объединить список списка с любым общим элементом в Python? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть два списка списка с одним общим элементом в python.

например, у меня есть список списка ниже:

[[1.0, 'Software Developer', 1256],
 [1.0, 'Software Developer', 1329],
 [1.0, 'Software Developer', 1469],
 [1.0, 'Software Developer', 2086],
 [0.9230769230769231, 'United States', 1256],
 [0.9230769230769231, 'United States', 1329],
 [0.9230769230769231, 'United States', 1469],
 [0.9230769230769231, 'United States', 2086]]

и вывод My Desire следующим образом:

{'ID': 1469,
 'Location': 'United States',
 'Location_score': 0.9230769230769231,
 'title': 'Software Developer',
 'title_score': 1.0}

{'ID': 1256,
 'Location': 'United States',
 'Location_score': 0.9230769230769231,
 'title': 'Software Developer',
 'title_score': 1.0}

Это пример вывода, который я хочу сделать для всех.

Может кто-нибудь сказать, пожалуйста, как объединить все общие элементы, которые являются последними во всем списке.а затем конвертировать список в словаре.

Я пытался использовать функцию 'Union'.и сделал несколько Google, но я не получил правильный ответ.

Может кто-нибудь, пожалуйста, помогите мне в этом.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Это один подход с использованием коллекций.

data = [[1.0, 'Software Developer', 1256],
 [1.0, 'Software Developer', 1329],
 [1.0, 'Software Developer', 1469],
 [1.0, 'Software Developer', 2086],
 [0.9230769230769231, 'United States', 1256],
 [0.9230769230769231, 'United States', 1329],
 [0.9230769230769231, 'United States', 1469],
 [0.9230769230769231, 'United States', 2086]]

from collections import defaultdict
d = defaultdict(list)
for i in data:
    d[i[-1]].extend(i)
res = []
for i in d.values():
    res.append({"ID": i[-1], 'title_score': i[0], 'title': i[1],'Location_score':i[3], 'Location': i[4]})
print(res)

Вывод:

[{'Location_score': 0.9230769230769231, 'Location': 'United States', 'ID': 1256, 'title_score': 1.0, 'title': 'Software Developer'}, {'Location_score': 0.9230769230769231, 'Location': 'United States', 'ID': 1329, 'title_score': 1.0, 'title': 'Software Developer'}, {'Location_score': 0.9230769230769231, 'Location': 'United States', 'ID': 1469, 'title_score': 1.0, 'title': 'Software Developer'}, {'Location_score': 0.9230769230769231, 'Location': 'United States', 'ID': 2086, 'title_score': 1.0, 'title': 'Software Developer'}]
0 голосов
/ 04 июня 2018

Используя простой дикт, предполагая только, что записи "title" идут первыми:

>>> lol = [[1.0, 'Software Developer', 1256],
...  [1.0, 'Software Developer', 1329],
...  [1.0, 'Software Developer', 1469],
...  [1.0, 'Software Developer', 2086],
...  [0.9230769230769231, 'United States', 1256],
...  [0.9230769230769231, 'United States', 1329],
...  [0.9230769230769231, 'United States', 1469],
...  [0.9230769230769231, 'United States', 2086]]
>>> 
>>> keys = [(gr + '_score', gr, 'ID') for gr in ('title', 'Location')]
>>> 
>>> out = {}
>>> for L in lol:
...     d = out.setdefault(L[-1], {})
...     d.update(zip(keys[bool(d)], L))
... 
>>> out # dict of dicts
{1256: {'title_score': 1.0, 'title': 'Software Developer', 'ID': 1256, 'Location_score': 0.9230769230769231, 'Location': 'United States'}, 1329: {'title_score': 1.0, 'title': 'Software Developer', 'ID': 1329, 'Location_score': 0.9230769230769231, 'Location': 'United States'}, 1469: {'title_score': 1.0, 'title': 'Software Developer', 'ID': 1469, 'Location_score': 0.9230769230769231, 'Location': 'United States'}, 2086: {'title_score': 1.0, 'title': 'Software Developer', 'ID': 2086, 'Location_score': 0.9230769230769231, 'Location': 'United States'}}
>>> list(out.values()) # list of dicts
[{'title_score': 1.0, 'title': 'Software Developer', 'ID': 1256, 'Location_score': 0.9230769230769231, 'Location': 'United States'}, {'title_score': 1.0, 'title': 'Software Developer', 'ID': 1329, 'Location_score': 0.9230769230769231, 'Location': 'United States'}, {'title_score': 1.0, 'title': 'Software Developer', 'ID': 1469, 'Location_score': 0.9230769230769231, 'Location': 'United States'}, {'title_score': 1.0, 'title': 'Software Developer', 'ID': 2086, 'Location_score': 0.9230769230769231, 'Location': 'United States'}]

Или --- если порядок диктов имеет значение (Python 3.6+ неофициальный, Python 3.7+ официальный):

>>> out = {}
>>> for l in lol:
...     d = out.setdefault(l[-1], {})
...     d.update(zip(*map(reversed, (keys[bool(d)], l))))
... 
>>> out
{1256: {'ID': 1256, 'title': 'Software Developer', 'title_score': 1.0, 'Location': 'United States', 'Location_score': 0.9230769230769231}, 1329: {'ID': 1329, 'title': 'Software Developer', 'title_score': 1.0, 'Location': 'United States', 'Location_score': 0.9230769230769231}, 1469: {'ID': 1469, 'title': 'Software Developer', 'title_score': 1.0, 'Location': 'United States', 'Location_score': 0.9230769230769231}, 2086: {'ID': 2086, 'title': 'Software Developer', 'title_score': 1.0, 'Location': 'United States', 'Location_score': 0.9230769230769231}}
0 голосов
/ 04 июня 2018

Использование collections.defaultdict:

from collections import defaultdict

lst = [[1.0, 'Software Developer', 1256],
       [1.0, 'Software Developer', 1329],
       [1.0, 'Software Developer', 1469],
       [1.0, 'Software Developer', 2086],
       [0.9230769230769231, 'United States', 1256],
       [0.9230769230769231, 'United States', 1329],
       [0.9230769230769231, 'United States', 1469],
       [0.9230769230769231, 'United States', 2086]]

# initialize defaultdict of dicts
d = defaultdict(dict)

# calculate half length of list
n = int(len(lst)/2)

# iterate first part of list
for title_score, title, ID in lst[:n]:
    d[ID]['title_score'] = title_score
    d[ID]['title'] = title

# iterate second part of list
for Location_score, Location, ID in lst[n: len(lst)]:
    d[ID]['Location_score'] = Location_score
    d[ID]['Location'] = Location

Результат

defaultdict(dict,
            {1256: {'Location': 'United States', 'Location_score': 0.9230769230769231,
                    'title': 'Software Developer', 'title_score': 1.0},
             1329: {'Location': 'United States', 'Location_score': 0.9230769230769231,
                    'title': 'Software Developer', 'title_score': 1.0},
             1469: {'Location': 'United States', 'Location_score': 0.9230769230769231,
                    'title': 'Software Developer', 'title_score': 1.0},
             2086: {'Location': 'United States', 'Location_score': 0.9230769230769231,
                    'title': 'Software Developer', 'title_score': 1.0}})

Если вам нужен список словарей, вы можете использовать понимание списка:

res = [{**{'ID': k}, **v} for k, v in d.items()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...