如何在Python有序字典上使用map/reduce

如何在Python有序字典上使用map/reduce,python,lambda,mapreduce,Python,Lambda,Mapreduce,我有一个嵌套的python字典,如下所示: my_dictionary = {"Ab" : {'name': 'usa', 'boolean': 'YES'}, "Ac" : {'name': 'usa', 'boolean': 'NO'}, "Ad": {'name': 'UK', 'boolean': 'NO'}, "Ae": {'name': 'UK', 'boolean': 'NO'}} from collections import OrderedDict sorted_dict =

我有一个嵌套的python字典,如下所示:

my_dictionary = {"Ab" : {'name': 'usa', 'boolean': 'YES'},
"Ac" : {'name': 'usa', 'boolean': 'NO'},
"Ad": {'name': 'UK', 'boolean': 'NO'},
"Ae": {'name': 'UK', 'boolean': 'NO'}}
from collections import OrderedDict
sorted_dict = OrderedDict(sorted(my_dictionary.iteritems(), key=lambda x: x[1]['name']))
print sorted_dict
reduce(lambda x,y: x['boolean'] or y['boolean']
我从上面的字典创建了一个有序字典,如下所示:

my_dictionary = {"Ab" : {'name': 'usa', 'boolean': 'YES'},
"Ac" : {'name': 'usa', 'boolean': 'NO'},
"Ad": {'name': 'UK', 'boolean': 'NO'},
"Ae": {'name': 'UK', 'boolean': 'NO'}}
from collections import OrderedDict
sorted_dict = OrderedDict(sorted(my_dictionary.iteritems(), key=lambda x: x[1]['name']))
print sorted_dict
reduce(lambda x,y: x['boolean'] or y['boolean']
这使得:

OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES'}),
("Ac", {'name': 'usa', 'boolean': 'NO'}),
("Ad", {'name': 'UK', 'boolean': 'NO'}),
("Ae", {'name': 'UK', 'boolean': 'NO'})])
我需要在有序字典中添加一个新列(“结果”)。创建新列的逻辑如下所示:

收集所有具有相同“名称”的行:此处为“usa”和“UK”。然后应用基于“boolean”列的reduce方法。函数应该是二进制的“或”(| |)

我试着这样应用reduce:

my_dictionary = {"Ab" : {'name': 'usa', 'boolean': 'YES'},
"Ac" : {'name': 'usa', 'boolean': 'NO'},
"Ad": {'name': 'UK', 'boolean': 'NO'},
"Ae": {'name': 'UK', 'boolean': 'NO'}}
from collections import OrderedDict
sorted_dict = OrderedDict(sorted(my_dictionary.iteritems(), key=lambda x: x[1]['name']))
print sorted_dict
reduce(lambda x,y: x['boolean'] or y['boolean']
但在选择所有具有相同“名称”的行时陷入了困境

因此,最终的有序字典如下所示:

OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES', 'result': 'YES'}),
("Ac", {'name': 'usa', 'boolean': 'NO', 'result': 'YES'}),
("Ad", {'name': 'UK', 'boolean': 'NO', 'result': 'NO'}),
("Ae", {'name': 'UK', 'boolean': 'NO', 'result': 'NO'})])

让我帮你一点忙:

  • 你介绍的有序词典在这里并不重要。你可以省略它,当你完成你的逻辑时再引入它
  • 在第一个开始时,我会将
    “Yes”
    转换为
    True
    “No”
    转换为
    False
    。让生活变得简单,而不是复杂
  • 您可以不使用
    lambda
    reduce
    。Python与
    any
    语句一起具有列表理解功能
    any
    将布尔
    运算符应用于布尔值列表
    让我帮你一点忙:

  • 你介绍的有序词典在这里并不重要。你可以省略它,当你完成你的逻辑时再引入它
  • 在第一个开始时,我会将
    “Yes”
    转换为
    True
    “No”
    转换为
    False
    。让生活变得简单,而不是复杂
  • 您可以不使用
    lambda
    reduce
    。Python与
    any
    语句一起具有列表理解功能
    any
    将布尔
    运算符应用于布尔值列表
    我不确定我是否做得很好。但我希望这就是你想要的

    from functools import reduce
    from itertools import groupby
    
    
    def reduceByKey(func, iterable): 
        return map(              
          lambda l: (l[0], reduce(func, map(lambda p: p[1], l[1]))),
          groupby(sorted(iterable, key=lambda p: p[0]), lambda p: p[0])
        )
    
    reduceByKey(
      # Are you sure you want to do ("YES" or "NO") not (True or False) ?
      lambda x, y: x or y
      map(lambda d: yourDict[d]["name"], yourDict[d]["boolean"], yourDict)
    )
    

    你的字典
    这是你的原始字典

    我不确定我是否弄好了。但我希望这就是你想要的

    from functools import reduce
    from itertools import groupby
    
    
    def reduceByKey(func, iterable): 
        return map(              
          lambda l: (l[0], reduce(func, map(lambda p: p[1], l[1]))),
          groupby(sorted(iterable, key=lambda p: p[0]), lambda p: p[0])
        )
    
    reduceByKey(
      # Are you sure you want to do ("YES" or "NO") not (True or False) ?
      lambda x, y: x or y
      map(lambda d: yourDict[d]["name"], yourDict[d]["boolean"], yourDict)
    )
    

    yourDict
    这是您的原始词典

    这里有一个方法似乎可以处理您提供的数据,但我不确定这与reduce有什么关系

    from collections import OrderedDict, defaultdict
    
    d = OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES'}),
                     ("Ac", {'name': 'usa', 'boolean': 'NO'}),
                     ("Ad", {'name': 'UK', 'boolean': 'NO'}),
                     ("Ae", {'name': 'UK', 'boolean': 'NO'})])
    
    
    def add_result(d, ikey='name', check='boolean', tt='YES', ff='NO'):
        # hold results per ikey
        ikey_results = defaultdict(lambda: ff)
        # first pass to get results
        for v in d.values():
            if v[check] == tt:
                ikey_results[v[ikey]] = tt
        # second pass to embedd results
        for v in d.values():
            v['result'] = ikey_results[v[ikey]]
        return d
    
    print add_result(d)
    
    屈服

    OrderedDict([('Ab', {'boolean': 'YES', 'name': 'usa', 'result': 'YES'}),
                 ('Ac', {'boolean': 'NO', 'name': 'usa', 'result': 'YES'}), 
                 ('Ad', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'}), 
                 ('Ae', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'})])
    

    这里有一种方法似乎适用于您提供的数据,但我不确定这与reduce有何关系

    from collections import OrderedDict, defaultdict
    
    d = OrderedDict([("Ab", {'name': 'usa', 'boolean': 'YES'}),
                     ("Ac", {'name': 'usa', 'boolean': 'NO'}),
                     ("Ad", {'name': 'UK', 'boolean': 'NO'}),
                     ("Ae", {'name': 'UK', 'boolean': 'NO'})])
    
    
    def add_result(d, ikey='name', check='boolean', tt='YES', ff='NO'):
        # hold results per ikey
        ikey_results = defaultdict(lambda: ff)
        # first pass to get results
        for v in d.values():
            if v[check] == tt:
                ikey_results[v[ikey]] = tt
        # second pass to embedd results
        for v in d.values():
            v['result'] = ikey_results[v[ikey]]
        return d
    
    print add_result(d)
    
    屈服

    OrderedDict([('Ab', {'boolean': 'YES', 'name': 'usa', 'result': 'YES'}),
                 ('Ac', {'boolean': 'NO', 'name': 'usa', 'result': 'YES'}), 
                 ('Ad', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'}), 
                 ('Ae', {'boolean': 'NO', 'name': 'UK', 'result': 'NO'})])
    
    这个

    不需要订购字典

    这个



    不需要订购字典

    使用熊猫包中的数据帧怎么样?@Elmex80s:我也在考虑这个问题。但是,它可以集成到纯python代码库中吗。我只在笔记本电脑上使用过熊猫,而不是在一个成熟的项目中。不要使用
    sorted
    作为变量名,它隐藏了内置的
    sorted
    方法,可能会给您带来问题。@InbarRose:谢谢。编辑now@Elmex80s:“是的”。现在编辑:-)请您将问题向上投票以获得更多可见性:-)使用熊猫包中的数据帧怎么样?@Elmex80s:我也在考虑这个问题。但是,它可以集成到纯python代码库中吗。我只在笔记本电脑上使用过熊猫,而不是在一个成熟的项目中。不要使用
    sorted
    作为变量名,它隐藏了内置的
    sorted
    方法,可能会给您带来问题。@InbarRose:谢谢。编辑now@Elmex80s:“是的”。现在编辑:-)请你把这个问题投上一票,以便更具可视性:-)我喜欢你的第二点。第一点:我有10000个这样的列。这是最简单的版本。我想一旦我对它进行排序,我应该能够在“名称”列中获取具有相同值的行。@user3683555谢谢,但是第一点和第三点可能也很有价值。我喜欢你的第二点。第一点:我有10000个这样的列。这是最简单的版本。我想,一旦我对其排序,我应该能够在“名称”列中获取具有相同值的行。@user3683555谢谢,但第一点和第三点可能也很有价值。这个答案绝对正确。也检查其他人这个答案绝对正确。也检查其他对象是的,但您正在销毁旧对象,并创建一个新对象。OP需要就地IMHO。@在这种情况下,请删除字典理解并用for循环替换它。是的,但您正在销毁旧对象,并创建一个新对象。在这种情况下,移除字典理解并替换为for循环。