Map减少python中的问题

时间:2011-09-26 20:58:18

标签: python map reduce

我目前正在努力完成任务。该解决方案将输入一个txt文件,并通过计算回文数量及其频率来计算。我需要使用Map reduce来创建这样做

例如:字符串“bab bab bab cab cac dad”将输出:

bab 3
cab 1
dad 1

这是我到目前为止所拥有的

def palindrome(string):
    palindromes = []
    for word in string.split(" "):
        if (word == word[::-1]):
            palindromes.append(word)
    return palindromes 

string = "abc abd bab tab cab tat yay uaefdfdu"
print map(lambda x: palindrome(x), ["bab abc dab bab bab dad crap pap pap "])

目前正在打印

[['bab', 'bab', 'bab', 'dad', 'pap', 'pap', '']]

这是我到目前为止在减少部分

的尝试
def p(lists):
for list in lists:

set_h = set(list) 

return set_h

使用p函数我想创建一组找到的所有回文。然后在列表上运行一个回文计数并从这个

中删除
print reduce(p, [['bab', 'bab', 'bab', 'dad', 'pap', 'pap', '']])

我是在正确的轨道上吗?

5 个答案:

答案 0 :(得分:3)

如果您的map()reduce()输入是实际的单词列表,我认为这样会更容易。要实现这一点,请在将字符串传递给.split()之前map()。然后map()一个字或者一个字(如果你的映射器遇到回文)或None。然后,您可以filter()结果放弃None值,对其进行排序并将其传递给reduce()。然后,reduce()会将其缩小为dict映射到其总计数的字词。

我不会为您提供一个不会偏离学习因素的有效解决方案。

答案 1 :(得分:1)

对于你的reduce函数,你应该从一个空的dict开始并更新/填充你的计数。减少功能需要2个参数,因此一个可以是你的dict,另一个是你的回文。您可以像这样在reduce中输入初始值:

reduce(lambda x, y: x+y, some_list, initial_value_for_x)

请查看dict's get有关如何设置默认值的信息,这可以帮助您简化缩减功能。

答案 2 :(得分:1)

在映射之前将字符串拆分为列表。 map()适用于列表,集和词组,不是字符串。

word_list = words_str.split(" ")

除非你的作业规定,否则请避免使用 map-filter-reduce ; GVR says so。正确的解决方案使用Python的list comprehension语法。事实上,你可以用一个非常讨厌的单行代码来做到这一点:

pal_count = {
    x: word_list.count(x)  # reduce-ish
    for x in word_list     # map-ish
    if x == x[::-1]        # filter-ish
    }
for x, y in pal_count.iteritems():
    print x, y             # print the results!

打破它......

  1. 在字典对象中抓住它以便稍后打印:pal_count = {
  2. 定义返回对象:x: word_list.count(x)我们使用key:value语法将回文 x 与其出现次数相关联。 count() 就像是列表的内置缩减功能。
  3. 使用 for循环遍历我们的列表,将当前值分配给'x':for x in word_list
  4. 我们只想返回回文,因此我们将过滤的比较运算符添加到错误的值中:if x == x[::-1] # cool logic, btw
  5. 乌拉! }
  6. 顺便说一句,我只做你的功课,因为我从来没有做过我的。

    较慢,灵活性较差,可移植性较差, awesome 等效项较少,使用嵌套for循环:

    pal_count = dict()
    for x in word_list:                     # same loop
        if x == x[::-1]                     # is this a palindrome?
            if x in pal_count:              # have we seen before?
                pal_count[x] += 1
            else:                           # this one is new!
                pal_count.setdefault(x, 1)
    

答案 3 :(得分:1)

如果我们将问题分解为小挑战,那将非常简单。在我们的例子中,这可能是:

  1. 从单词列表中过滤掉所有回文。
  2. 获取独特的单词以查找计数。
  3. 将所有独特单词映射到适当的计数。
  4. 代码:

    words =  "bab bab bab cab cac dad"
    is_palindrome = lambda word : word == word[::-1]
    palindromes = filter(is_palindrome,words.split(" "))
    get_count = lambda word : (word , palindromes.count(word))
    unique = set(palindromes)
    dict(map(get_count,unique))
    Out[1]: {'bab': 3, 'cac': 1, 'dad': 1}
    

    这是简短的解释:

    #Input:
        words =  "bab bab bab cab cac dad"
    
    #Step 1: Filter out the palindromes.
        is_palindrome = lambda word : word == word[::-1]
        palindromes = filter(is_palindrome,words.split(" "))
    
    #Step 2: Get the unique set of string to find their counts.
        unique = set(palindromes)
    
    #Step 3: Map every unique palindrome to their respective count.
        get_count = lambda word : (word , palindromes.count(word))
        dict(map(get_count,unique))
    
    #Output:
        Out[1]: {'bab': 3, 'cac': 1, 'dad': 1}
    

    注意: python中的map可以接受任何序列,而不仅仅是list,set或dict。 python中的字符串也是序列,因此不满足于Cody Hess的语句:map不能接受字符串。

    这里演示的是一个非常简单的演示:

    In [10]: map(echo, "python")
    Out[10]: ['p', 'y', 't', 'h', 'o', 'n']
    

答案 4 :(得分:0)

对于map / reduce,使用Counter对象非常简单。

from collections import Counter 
words = "bab bab bab cab cac dad"
words_list = words.split(" ") 
cont = Counter()
for word in words_list:
    cont[word] += 1
print(cont)
# or if you want dict
print(dict(cont))

https://docs.python.org/3/library/collections.html