我目前正在努力完成任务。该解决方案将输入一个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', '']])
我是在正确的轨道上吗?
答案 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!
打破它......
pal_count = {
x: word_list.count(x)
我们使用key:value语法将回文 x 与其出现次数相关联。 count() 就像是列表的内置缩减功能。for x in word_list
if x == x[::-1] # cool logic, btw
}
顺便说一句,我只做你的功课,因为我从来没有做过我的。
较慢,灵活性较差,可移植性较差, 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)
如果我们将问题分解为小挑战,那将非常简单。在我们的例子中,这可能是:
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))