在python中的列表列表上使用定义的函数

时间:2018-09-12 18:55:23

标签: python mapreduce

我有一个已定义的功能:

def map(id,txt):
   mapop= []
   words = txt.split()
   for word in words:
     tmp= (word,id,1)
     mapop.append(tmp)
   return mapop 

我尝试使用许多方法在列表列表中应用此功能,但没有一个起作用。

  1. 下面给出了AttributeError:'list'对象没有属性'split'

    list(map(len,filtered_wordList))
    
  2. 这会导致TypeError:map()缺少1个必需的位置参数:'txt'

    [map(item) for item in filtered_wordList] 
    
  3. 这将导致TypeError:map()接受2个位置参数,但给出了89个

    mapped=[]
    for line in filtered_wordList:
       temp=map(*line)
    mapped.append(temp)
    

能否让我知道我要去哪里错了。

2 个答案:

答案 0 :(得分:0)

如果您这样使用功能图:

text = 'Stack Overflow is great'
map(2, text)

它输出:

[('Stack', 2, 1), ('Overflow', 2, 1), ('is', 2, 1), ('great', 2, 1)]

您的函数接受一个id变量和一个文本(应该是字符串)。 它将像这样在空间上分割文本:

['Stack', 'Overflow', 'is', 'great'] 

并循环遍历此列表中的每个单词,并添加一个包含该单词,您传递的id和1的元组到mapop列表中,如下所示:

('Stack', 2, 1)

在遍历每个单词之后,它返回mapop

答案 1 :(得分:0)

正如其他人指出的那样,直接的问题是您在和自己争论:您对函数应使用的参数并不一致-无论输入文本是单个句子还是句子列表。我自由地更改了函数名。我认为这是一个建议的用途,可以解决您的问题。您可以将多个语句块减少到一行,但是我希望当前版本对您而言更具可读性。

filtered_wordlist = [
    'Call me Ishmael',
    'The boy was odd',
    'They could only say it just "happened to happen" and was not very likely to happen again.'
]

def word_id(id,txt):
   mapop= []
   words = txt.split()
   for word in words:
     tmp= (word,id,1)
     mapop.append(tmp)
   return mapop 


lexicon = []
for id, sentence in enumerate(filtered_wordlist):
    lexicon.append(word_id(id, sentence))

print(lexicon)

输出(为了便于阅读,带有额外的换行符):

[('Call', 0, 1), ('me', 0, 1), ('Ishmael', 0, 1),
 ('The', 1, 1), ('boy', 1, 1), ('was', 1, 1), ('odd', 1, 1),
 ('They', 2, 1), ('could', 2, 1), ('only', 2, 1), ('say', 2, 1),
 ('it', 2, 1), ('just', 2, 1), ('"happened', 2, 1), ('to', 2, 1),
 ('happen"', 2, 1), ('and', 2, 1), ('was', 2, 1), ('not', 2, 1),
 ('very', 2, 1), ('likely', 2, 1), ('to', 2, 1), ('happen', 2, 1),
 ('again.', 2, 1)]