В скольких списках появляется термин - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть X списков, например:

[potato, pie]
[chicken,chicken,pie,donkey,potato,potato]

Я хочу проверить, в каком списке отображается термин:

Например:

С двумя вышеупомянутыми списками я хотел бы, чтобы вывод был:

(potato,2)
(pie,2)
(chicken,1) - chicken is only one because it appears only in list two, not in list one.
(donkey,1)

Моя попытка, но я делал это совершенно неправильно и был сбит с толку, и если я даже выбирал правильный подход:

x = ['potato', 'pie']
z = ['chicken','chicken','pie','donkey','potato','potato']
list_final = x + z

dict_final = {}

for item in list_final:
    if item in dict_final.keys():
        dict_final.update({item:(dict_final.get(item) + 1)})
    else:
        dict_final.update({item:1})


print(dict_final)

Я пробовал это, но это только подсчитывает, сколько раз он появляется в списке:

{'potato': 3, 'pie': 2, 'chicken': 2, 'donkey': 1}

но я пытаюсь получить:

{'potato': 2, 'pie': 2, 'chicken': 1, 'donkey': 1}

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

, если вы сделаете его более функциональным)


from collections import Counter
from functools import reduce

x = ['potato', 'pie']
y = ['chicken','chicken','pie','donkey','potato','potato']
all_lists = [x, y]
dict(Counter(reduce(lambda x, y: x + list(set(y)), all_lists, [])).most_common())
# {'potato': 2, 'pie': 2, 'donkey': 1, 'chicken': 1}
0 голосов
/ 21 февраля 2019

просто ради интереса: вот сроки решений, доступных до сих пор:

1. double for loop dict    :   8.1e-06
2. for loop LC into dict   :   1.32e-05
3. LC into LC              :   1.37e-05
4. for loop LC into list   :   1.41e-05
5. LC into DC              :   1.41e-05
6. Counter/reduce          :   2.47e-05
7. Counter/reduce into dict:   2.64e-05

Код для синхронизации:

import timeit

rep = 100000
n = 5

setup = """
from collections import Counter
from functools import reduce
x = ['potato', 'pie']
z = ['chicken','chicken','pie','donkey','potato','potato']
all_lists = [x, z]
items = set(x + z)
list_final = []
dict_final = {}
"""

fcts = {
        'Counter/reduce':
            'Counter(reduce(lambda x, z: x + list(set(z)), all_lists, [])).most_common()',
        'Counter/reduce into dict':
            'dict(Counter(reduce(lambda x, z: x + list(set(z)), all_lists, [])).most_common())',
        'double for loop dict':
            '''for i in items:
                for lst in (x, z):
                    if i in lst:
                        dict_final[i] = dict_final.get(i, 0) + 1
                        ''',
        'for loop LC into dict':
            '''for i in items:
    cntr = sum([i in lst for lst in (x, z)])
    dict_final[i] = cntr''',
        'for loop LC into list':
            '''for i in items:
    cntr = sum([i in lst for lst in (x, z)])
    list_final.append((i, cntr))''',
        'LC into LC':
            '[(i, sum([1 for lst in (x, z) if i in lst])) for i in items]',
        'LC into DC':
            '{i: sum([i in lst for lst in (x, z)]) for i in items}'
        }

L = max((len(k) for k in fcts.keys()))
results = []
for k, v in fcts.items():
    print(f'timing {k}...')
    tt = timeit.Timer(v, setup=setup)
    t = min(tt.repeat(repeat=rep, number=n))
    results.append((k, t))
for i, (k, t) in enumerate(sorted(results, key=lambda x: x[1])):
    print(f'{i+1}. {k:{L}}:   {t:.3}')
0 голосов
/ 21 февраля 2019

Вам следует перебрать set списка ваших предметов, чтобы они не учитывались дважды.Кроме того, вам придется перебирать все элементы и по спискам:

x = ['potato', 'pie']
z = ['chicken','chicken','pie','donkey','potato','potato']
items = set(x + z)
dict_final = {}

for i in items:
    for lst in [x, z]:
        if i in lst:
            dict_final[i] = dict_final.get(i, 0) + 1

# {'chicken': 1, 'donkey': 1, 'potato': 2, 'pie': 2}

Для создания списка кортежей вы можете сделать

list_final = []
for i in items:
    cntr = sum([i in lst for lst in (x, z)])
    list_final.append((i, cntr))

... и для поклонников oneliners:

list_final = [(i, sum([i in lst for lst in (x, z)])) for i in items]
dict_final = {i: sum([i in lst for lst in (x, z)]) for i in items}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...