python列表计数元素

时间:2016-02-26 03:15:13

标签: python list dictionary lambda

我的代码如下

我怎样才能发现abc是一个由列表组成的列表?

我的地图功能出了什么问题?

我希望我的函数返回输入列表中每个元素的计数除以列表的长度。

这样的东西
{'brown': 0.16666666666666666, 'lazy': 0.16666666666666666, 'jumps': 0.16666666666666666, 'fox': 0.16666666666666666,  'dog': 0.16666666666666666, 'quick': 0.16666666666666666}

我的代码:

quickbrownfox1=['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']
print quickbrownfox1


def tf(tokens):

    abc=([[x,(tokens.count(x))] for x in set(tokens)])
    print type(abc)#how to know that abc is made up of lists
    print type(abc[1])
    answer=abc.map(lambda input:(input(0)),input(1)/len(tokens)))

    return answer
    #return <FILL IN>

print tf((quickbrownfox1)) # Should give { 'quick': 0.1666 ... }
#print tf(tokenize(quickbrownfox)) # Should give { 'quick': 0.1666 ... }

_______________________________________

更新1

我更新了我的代码,如下所示。我得到结果[('brown', 0), ('lazy', 0), ('jumps', 0), ('fox', 0), ('dog', 0), ('quick', 0)]知道为什么?如果我return return list(map(lambda input: (input[0], input[1]), abc)),则会给出正确的结果 - [('brown', 1), ('lazy', 1), ('jumps', 1), ('fox', 1), ('dog', 1), ('quick', 1)]

from __future__ import division
quickbrownfox1=['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

def islistoflists(i):
    if isinstance(i, list):
        if len(i) > 0 and all(isinstance(t, list) for t in i):
            return True
    return False


def tf(tokens):

    print(islistoflists(tokens))

    abc = ([[x,tokens.count(x)] for x in set(tokens)])
    return list(map(lambda input: (input[0], input[1] / len(tokens)), abc))

print tf(quickbrownfox1)

更新2

我正在使用pyspark / spark。这可能是我在update1中面临的问题的原因吗?

3 个答案:

答案 0 :(得分:1)

反制解决方案肯定会更好。您对tokens.count的使用为代码提供了二次时间复杂度。继承你修改的代码。您应该注意map是一个独立的函数,而不是列表或任何其他类型的成员函数。

from __future__ import division
quickbrownfox1=['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

def islistoflists(i):
    if isinstance(i, list):
        if len(i) > 0 and all(isinstance(t, list) for t in i):
            return True
    return False


def tf(tokens):

    print(islistoflists(tokens))

    abc = ([[x,tokens.count(x)] for x in set(tokens)])
    return list(map(lambda input: (input[0], input[1] / len(tokens)), abc))

print tf(quickbrownfox1)

要测试是否有列表列表,可以使用isinstance检查父对象的类型,如果是列表并且其中至少包含一个元素,则可以使用{ {1}}检查每个子对象是否为列表。

请注意,我让你的函数返回一个元组列表,暗示这些项是只读的,但是你可以通过改变它来返回一个列表列表。

isinstance

如果仔细观察,你会发现一组括号已被替换为方括号,使每个元素成为一个列表。

如果你有一个不支持return list(map(lambda input: [input[0], input[1] / len(tokens)], abc)) 导入的旧版本的python 2,你可以使用以下解决方法强制浮点除法。

from __future__ import division

答案 1 :(得分:0)

基于我认为您的要求,您可以执行类似

的操作
token_size = len(tokens)
word_counter_list = {}
for word in tokens:
    if word in word_counter_list:
        word_counter_list[word] += 1
    else:
        word_counter_list[word] = 1

for word, amount in word_counter_list:
    print("The word " + word + " was used " + str(amount/token_size)

据说这个问题不是很清楚,因为你提到了列表类型(),但在列表中显示了单词频率的百分比

答案 2 :(得分:0)

您应该可以使用Counter

轻松完成此操作
$ python3
Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
@>>> from collections import Counter
@>>> c = Counter(['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog'])
@>>> total = sum(c.values())
@>>> result = dict()
@>>> for key, value in c.items():
@...   result[key] = value/total
@... 
@>>> result
{'dog': 0.16666666666666666, 'quick': 0.16666666666666666, 'fox': 0.16666666666666666, 'brown': 0.16666666666666666, 'jumps': 0.16666666666666666, 'lazy': 0.16666666666666666}

或者,使它成为超级pythonic:

dict([ (key, value/total) for key,value in c.items() ])