我有一个嵌套列表,其中包含不止一次出现的各种名称。我需要编写一个函数来计算每个名称出现的次数,然后将其附加到一个列表中,该列表显示名称,然后是它的计数。例如,输入可能如下所示:
L = [['Jimmy', 'Henry'], ['Henry', 'Bob'], ['Lucas', 'Jimmy']]
我希望输出是这样的列表:
newList = [['Jimmy', 2], ['Henry', 2], ['Bob', 1], ['Lucas', 1]]
我写了以下函数:
def nameCount(target):
count = 0
name = target
for subList in L:
if name in subList:
count += 1
print(count)
然而,这仅产生一个我必须指定为目标的名称的数量。我希望它遍历每个名称并计算它在那里的次数,然后将其附加到新列表中。
答案 0 :(得分:3)
from selenium import webdriver
from bs4 import BeautifulSoup
driver = webdriver.Edge()
driver.get('https://mojim.com/twy100468x17x18.htm')
pageSource = driver.page_source
你也可以使用带有for循环的vanilla dict:
from collections import Counter
print Counter(i for x in L for i in x).most_common()
# [('Jimmy', 2), ('Henry', 2), ('Bob', 1), ('Lucas', 1)]
答案 1 :(得分:3)
import collections
import itertools
L = [['Jimmy', 'Henry'], ['Henry', 'Bob'], ['Lucas', 'Jimmy']]
[list(i) for i in collections.Counter(itertools.chain(*L)).items()]
---> [['Bob', 1], ['Lucas', 1], ['Jimmy', 2], ['Henry', 2]]
答案 2 :(得分:1)
您可以使用collections.Counter
:
>>> collections.Counter(itertools.chain(*L))
Counter({'Bob': 1, 'Henry': 2, 'Jimmy': 2, 'Lucas': 1})
>>> collections.Counter(itertools.chain(*L)).items()
[('Bob', 1), ('Jimmy', 2), ('Lucas', 1), ('Henry', 2)]
不使用任何内置函数,您可以执行以下操作:
result = {}
for subList in L:
for name in subList:
result[name] = result.get(name, 0) + 1
print(result.items())
答案 3 :(得分:1)
如果你不想导入任何东西,你可以这样做:
L = [['Jimmy', 'Henry'], ['Henry', 'Bob'], ['Lucas', 'Jimmy']]
temp = [x for y in L for x in y] # flattens L
new_list = [[k, temp.count(k)] for k in set(temp)]
print(new_list) # [['Henry', 2], ['Lucas', 1], ['Bob', 1], ['Jimmy', 2]]
请注意,它不会保留顺序,因为它涉及创建集合。不需要创建temp
,但确实可以加快速度。它用于展平最初嵌套的原始列表。
答案 4 :(得分:0)
如果您只想使用基本对象:
L = [['Jimmy', 'Henry'], ['Henry', 'Bob'], ['Lucas', 'Jimmy']]
def nameCount(nested_names):
count = {}
for sub_list in nested_names:
for name in sub_list:
count[name] = count.get(name, 0) + 1
print(count)
nameCount(L)
输出:
{'Bob': 1, 'Jimmy': 2, 'Lucas': 1, 'Henry': 2}
如果你想要排序的元组:
print(sorted(count.items(), key=lambda x: x[1], reverse=True))
输出:
# [('Jimmy', 2), ('Henry', 2), ('Bob', 1), ('Lucas', 1)]
答案 5 :(得分:0)
如果您想使用numpy,以下内容将返回元组:
import numpy as np
L = [['Jimmy', 'Henry'], ['Henry', 'Bob'], ['Lucas', 'Jimmy']]
name, count = np.unique(L, return_counts=True)
zip(name, count)
以下内容还将返回字典:
dict(zip(name,count))
答案 6 :(得分:0)
你为什么不用dict?我会这样做:
def names_count(L):
result = {}
for subList in L:
for name in subList:
if name not in dict:
result[name] = 0
result[name] = result[name] + 1
return(result)
如果您必须使用结果列表,那么您可以使用此litle解决方法:
def get_index_of_list_with(list, name):
for i in len(list): # I normally prefered enumerate here but you didn't want anything but pure iteration, right?
if list[i] is name:
return i
list.append[name, 0]
return len(list) - 1
def nameCount(L):
result = []
for subList in L:
for name in subList:
index = get_index_of_list_with(result, name)
result[index] = result[index] + 1
print(result)
请注意,第二个解决方案根本不是pythonic,并且可能有更好的方法来编写第一个示例。他们只是草稿。