从列表中计数并附加它

时间:2017-05-09 11:20:42

标签: python list count

我有一个嵌套列表,其中包含不止一次出现的各种名称。我需要编写一个函数来计算每个名称出现的次数,然后将其附加到一个列表中,该列表显示名称,然后是它的计数。例如,输入可能如下所示:

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)

然而,这仅产生一个我必须指定为目标的名称的数量。我希望它遍历每个名​​称并计算它在那里的次数,然后将其附加到新列表中。

7 个答案:

答案 0 :(得分:3)

使用collections.Counter

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,并且可能有更好的方法来编写第一个示例。他们只是草稿。