Подсчитать один и тот же элемент в разных списках - PullRequest
0 голосов
/ 04 января 2019

Я хотел бы знать, как вы можете посчитать, сколько раз один и тот же элемент появляется в разных списках в Python. Количество списков не определено

Например:

[house,table,house]
[desk,computer,table] 

вернул бы словарь с

{house:[2,0], table:[1,1], desk:[0,1]}

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Альтернатива более многословна, но легка для понимания.

Сначала поместите списки в содержащий sueperlist:

superlist = [l1, l2]

Затем инициализируйте словарь (word_count) с необходимыми ключами (каждое слово появляется в списках):

word_count={}
for lst in superlist:
  for w in set(lst):
    word_count.setdefault(w, list())

Наконец, итерируйте по word_count, подбирая количество найденных слов:

for word in word_count.keys():
  for lst in superlist:
    word_count[word].append(lst.count(word))

Теперь word_count содержит:

#=> {'house': [2, 0], 'table': [1, 1], 'desk': [0, 1], 'computer': [0, 1]}


Все в методе для любого номера списка:
def count_words(*superlist):
  word_count={}
  for lst in superlist:
    for w in set(lst):
      word_count.setdefault(w, list())
  for word in word_count.keys():
    for lst in superlist:
      word_count[word].append(lst.count(word))
  return word_count

print(count_words(l1, l2))
#=> {'table': [1, 1], 'house': [2, 0], 'desk': [0, 1], 'computer': [0, 1]}
0 голосов
/ 04 января 2019

Выглядело интересно, поэтому я попробовал. Будет работать с произвольным количеством списков

a= [['house','table','house'],['desk','computer','table']]
from itertools import chain
d={}
for key in set(chain(*a)): #chain to get all the unique keys possible
    d.setdefault(key,[]) # set default value of every key as an empty list

for lis in a:           # Iterate over the list of lists

    for j in set(lis):  #convert the list to set as we do not want to count the items multiple times
        d[j].append(lis.count(j)) #append the count to the list associated with the key

    for key in set(d.keys())-set(lis): #keys which are present in power set but not in subset means item is not present
        d[key].append(0)    #append count as 0

print(d)

Вуаля, вы должны получить вывод, как показано ниже

{'house': [2, 0], 'computer': [0, 1], 'table': [1, 1], 'desk': [0, 1]}
0 голосов
/ 04 января 2019

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

list1 = ['house','table','house']
list2 = ['desk','computer','table']

def countElements(*lists):
    elements = set([elem for l in lists for elem in l])
    return dict((element,[l.count(element) for l in lists]) for element in elements)

print(countElements(list1,list2))

Результат:

{'table': [1, 1], 'computer': [0, 1], 'house': [2, 0], 'desk': [0, 1]}

В качестве альтернативы вы можете сохранить все эти списки в другом списке и снова просмотреть их таким же образом:

list1 = ['house','table','house']
list2 = ['desk','computer','table']

def countElements(lists):
    elements = set([elem for l in lists for elem in l])
    return dict((element,[l.count(element) for l in lists]) for element in elements)

print(countElements([list1,list2]))

Обратите внимание на разницу в сигнатуре функции и в вызове функции (аргумент представляет собой список списков).

0 голосов
/ 04 января 2019

Простой способ, если вы не хотите импортировать другие инструменты, - это использовать словарь , чтобы вести подсчет.

list_1 = ['house','table','house']
list_2 = ['desk','computer','table'] 

# instantiate a dict that will contain the number of appearances in each list, as a list
appearances = {}

# loop through the first list
for item in list_1:
    # If the item hasn't appeared yet, it will set the item's name as the key and [1, 0] as the value
    # appearances[item] is how we're going to set the key name in appearances
    # appearances.get(item, 0)[0] makes it so that if item is not a key in appearances, it sets the initial value at index 0 to [0, 0]. 
    #   Otherwise, it sets it to +1 of it's current value
    # We set appearances[item] to a list so that we can keep track of appearances in both lists
    # For list_1's first item, appearances would then be equal to: appearances = {'house': [1, 0]}
    appearances[item] = [appearances.get(item, [0, 0])[0] + 1, 0]

# Do the same for the second list, but use index of 1, instead of 0
for item in list_2:
    # We use appearances.get() twice in case we haven't seen the item yet in either list
    appearances[item] = [appearances.get(item, [0, 0])[0], appearances.get(item, [0, 0])[1] + 1]

# Print the result
print(appearances)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...