如何在Python有序字典上使用map/reduce
我有一个嵌套的python字典,如下所示:如何在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 =
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循环。