2017-05-26 24 views
3
def print_most_numbers_occurrences(numbers_str): 
    number_list = list(numbers_str) 
    for i in number_list: 
     i=max(number_list,key=number_list.count) 
    print(i) 

def test_print_most_numbers_occurrences(): 
    print_most_numbers_occurrences('2 3 40 1 5 4 3 3 9 9') 
    print_most_numbers_occurrences('9 30 3 9 3 1 4') 
    print_most_numbers_occurrences('19 30 13 4 9 3 1 4') 


def main(): 
    print(test_print_most_numbers_occurrences()) 


main() 

输出发现大多数的数字出现在列表中

None 

它的工作原理,当我尝试这样:

>>> lst = [1, 2, 45, 55, 5, 4, 4, 4, 4, 4, 545, 56, 6, 7, 67] 
>>> max(lst,key=lst.count) 
4 

我想,以确定发生的次数最多的号码。我不确定我的第一个def函数的错误。

+2

摆脱循环。并且做'numbers_str。split()'而不是'list(numbers_str)' – abccd

+0

注意所有的答案(上面的评论暗示):没有参数的'.split()'默认处理双空格 –

回答

3

首先,您需要正确地分析您的输入。由于其中一个输入具有双倍空间,因此您不能仅使用split(" ")

其次,你不需要循环,因为max为你做循环。

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(x) for x in numbers_str.split()] 
    i=max(number_list,key=number_list.count) 
    print(i) 

既然你是我的循环冒昧地认为你试图解决的情况下多个号码可能具有相同的事件(例如:'2 3 40 1 5 4 3 3 9 9 9')。在这种情况下,下面的代码会得到所有的最大值:

def print_most_numbers_occurrences(numbers_str): 
    print(numbers_str.split(" ")) 
    number_list = [int(x) for x in numbers_str.split()] 
    most_occurances = [] 
    for i in set(number_list): 
     occurances = number_list.count(i) 
     if len(most_occurances) == 0: 
      most_occurances.append(i) 
     elif most_occurances[0] < occurances: 
      most_occurances = [i] 
     elif most_occurances[0] == occurances: 
      most_occurances.append(i) 
    print(most_occurances) 

下面是一个使用稍微复杂的代码更简洁的版本:

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(x) for x in numbers_str.split()] 
    result = {i : number_list.count(i) for i in set(number_list)} 
    highest = max(result.values()) 
    most_occurances = [k for k, v in result.items() if v == highest] 
    print(most_occurances) 

如果你需要高效的代码,这是明智的使用collectionsCounter

from collections import Counter 

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(x) for x in numbers_str.split()] 
    result = Counter(number_list) 
    highest = max(result.values()) 
    most_occurances = [k for k, v in result.items() if v == highest] 
    print(most_occurances if len(most_occurances) > 1 else most_occurances[0]) 
+0

输出应该字符串是9和3('9 30 3 9 3 1 4') – Kee

+0

是。这是一个清单:'[9,3]'。你想用其他格式吗?我指的是第二个和第三个发布的方法(第一个只获得一个最大值)。 – Darkstarone

+0

如何删除方括号中的第三个方法的输出? – Kee

2

使用.split(”“),而不是列表()

string = '9 30 3 9 3 1 4' 
lst = map(int, filter(None, string.split(' '))) 
print(max(lst, key = lambda x: lst.count(x))) 
# returns 9 
0

实际上有与代码一对夫妇的问题,因为它目前为。你似乎是打印返回None函数的结果,你没有正确区分你的字符串:

def print_most_numbers_occurrences(numbers_str): 
    number_list = [int(number) for number in numbers_str.split(' ') if number != ""] 
    for i in number_list: 
     i=max(number_list,key=number_list.count) 
    print(i, number_list.count(i)) 

def test_print_most_numbers_occurrences(): 
    print_most_numbers_occurrences('2 3 40 1 5 4 3 3 9 9') 
    print_most_numbers_occurrences('9 30 3 9 3 1 4') 
    print_most_numbers_occurrences('19 30 13 4 9 3 1 4') 


def main(): 
    test_print_most_numbers_occurrences() 


main() 
+0

你是对的,但如何获得输出9,3的字符串('9 30 3 9 3 1 4')? – Kee

+0

@Kee更新了代码。它现在使用'.count'函数来查找出现次数。 – Neil

+0

你试过了吗?它不以这种方式工作。 – Kee

0

您可以轻松的写代码:

>>> import re 
>>> x 
'2  3 40 1 5 4 3 3 9 9' 
>>> list = re.sub(' +', ' ', x).split(' ') 
>>> list 
['2', '3', '40', '1', '5', '4', '3', '3', '9', '9'] 
>>> max(list, key=list.count) 
'3' 
>>> x = '19 30 13 4 9 3 1 4' 
>>> list = re.sub(' +', ' ', x).split(' ') 
>>> list 
['19', '30', '13', '4', '9', '3', '1', '4'] 
>>> max(list, key=list.count) 
'4' 
>>> 

所以你的功能应该是作为:

def fun(num_string): 
    num_list = re.sub(' +', ' ', num_string).split(' ') 
    print(max(num_list, key=num_list.count)) # you can write print but I prefer you should use return max(num_list, key=num_list.count) 
1

使用可以使用str.split()将您的字符串打破列表。然后,您可以使用map将字符串转换为整数。 A collections.Counter可用于以相对有效的方式对每个整数的出现进行计数。最后,max带有一个lambda参数,可以用来提取出目标值的出现次数。

string_list = '2 3 40 1 5 4 3 3 9 9'.split() 
int_list = map(int, string_list) 

from collections import Counter 

counter = Counter(int_list) 
target_value, occurrence_count = max(counter.items(), key=lambda t: t[1]) 

注意,没有参数提供给str.split并避免使用list.count(这是相当低效在这种情况下)。如果要获取所有出现次数最多的目标值,可以放弃最后一行并使用:

max_occurrences = max(counter.values()) 
target_values = [k for k, v in counter.items() if v == max_occurrences]