计算 Python 中二维列表中最常见的元素
Counting the most common element in a 2D List in Python
我正在寻找一种方法来计算二维列表中的出现次数。例如我有一个这样的列表:
[[John, 3],[Chris, 3],[Bryan,5],[John,3],[John,7]]
作为输出,我想计算 John 最常见的数字是哪些
Most common number for the John is: 3
我用
轻松完成了所有名称
Counter(my_list[1]).most_common(5)
有人建议这样做吗?
这应该有效。
from collections import Counter
main_list = [['John', 3],['Chris', 3],['Bryan',5],['John',3],['John',7]] #your_list
new_list = [i[1] for i in main_list if i[0]=='John']
print(Counter(new_list).most_common(1)[0][0])
我可能会在对输入数据进行查询之前重新调整输入数据的形状。也许名称与值:
name_lookup = defaultdict(list)
for name, value in my_list:
name_lookup[name].append(value)
name = 'John'
most_common, _ = Counter(name_lookup[name]).most_common(1)[0]
print(f"Most common number for {name} is: {most_common}")
您还可以进行过滤和映射:
my_list = [['John', 3],['Chris', 3],['Bryan',5],['John',3],['John',7]]
print(Counter(map(lambda y: y[1], filter(lambda x: x[0] == "John", my_list))).most_common(1))
如果您 100% 确定每个名称总是恰好有 1
个最频繁出现的元素,您可以按名称选择 sort
,按名称选择 groupby
,然后使用statistics.mode
以下方式:
import itertools
import statistics
some_data = [['John', 3],['Chris', 3],['Bryan',5],['John',3],['John',7]]
sorted_data = sorted(some_data,key=lambda x:x[0]) # sort by name
most_frequent = {name:statistics.mode(j[-1] for j in list(data)) for name,data in itertools.groupby(sorted_data,key=lambda x:x[0])}
print(most_frequent) # {'Bryan': 5, 'Chris': 3, 'John': 3}
itertools.groupby
returns 对名称数据,但由于 data
s 本身包含键(在我们的例子中是名称)和值(在我们的例子中是数字),我们需要理解获得 "raw" 个值。
我正在寻找一种方法来计算二维列表中的出现次数。例如我有一个这样的列表:
[[John, 3],[Chris, 3],[Bryan,5],[John,3],[John,7]]
作为输出,我想计算 John 最常见的数字是哪些
Most common number for the John is: 3
我用
轻松完成了所有名称Counter(my_list[1]).most_common(5)
有人建议这样做吗?
这应该有效。
from collections import Counter
main_list = [['John', 3],['Chris', 3],['Bryan',5],['John',3],['John',7]] #your_list
new_list = [i[1] for i in main_list if i[0]=='John']
print(Counter(new_list).most_common(1)[0][0])
我可能会在对输入数据进行查询之前重新调整输入数据的形状。也许名称与值:
name_lookup = defaultdict(list)
for name, value in my_list:
name_lookup[name].append(value)
name = 'John'
most_common, _ = Counter(name_lookup[name]).most_common(1)[0]
print(f"Most common number for {name} is: {most_common}")
您还可以进行过滤和映射:
my_list = [['John', 3],['Chris', 3],['Bryan',5],['John',3],['John',7]]
print(Counter(map(lambda y: y[1], filter(lambda x: x[0] == "John", my_list))).most_common(1))
如果您 100% 确定每个名称总是恰好有 1
个最频繁出现的元素,您可以按名称选择 sort
,按名称选择 groupby
,然后使用statistics.mode
以下方式:
import itertools
import statistics
some_data = [['John', 3],['Chris', 3],['Bryan',5],['John',3],['John',7]]
sorted_data = sorted(some_data,key=lambda x:x[0]) # sort by name
most_frequent = {name:statistics.mode(j[-1] for j in list(data)) for name,data in itertools.groupby(sorted_data,key=lambda x:x[0])}
print(most_frequent) # {'Bryan': 5, 'Chris': 3, 'John': 3}
itertools.groupby
returns 对名称数据,但由于 data
s 本身包含键(在我们的例子中是名称)和值(在我们的例子中是数字),我们需要理解获得 "raw" 个值。