我有一个名为cdc_year_births的python字典。
对于cdc_year_births,键是单位(在这种情况下单位是一年),值是该单位的出生数:
#include <stdio.h>
#include <string.h>
void count_get_ints(const char *data) {
int buf[10000];
int cnt = 0, j=0;
for (int i=0; i<strlen(data); i++) {
if (isspace(data[i] == false)
buf[j] = data[i]-'0';
j++;
}
printf("%d", j);
}
// when I check the buffer it includes all the digits of the numbers.
// i.e for my example.
// buf = {1,2,1,1,8,4,3,8,4,0,2,1,2}
// I want buf to be following
// buf = {1,2,11,84384,0,212}
我写了一个函数,它返回最大和最小年份及其出生时间。当我启动该功能时,我认为我分别将最大和最小单位硬编码为0和1000000000,然后遍历字典并将每个键的值与那些硬编码值进行比较;如果满足条件,我将替换最大/最小单位和最大/最小分娩。
但如果我使用的词典的负值或值大于1000000000,则此功能不起作用,这就是为什么我必须加载&#34;加载&#34;带有第一个循环的字典中的一些实际值,然后再次循环它们。
我构建了这个功能但无法使其正常工作:
print(cdc_year_births)
{2000: 4058814, 2001: 4025933, 2002: 4021726, 2003: 4089950, 1994: 3952767,
1995: 3899589, 1996: 3891494, 1997: 3880894, 1998: 3941553, 1999: 3959417}
导致TypeError:unorderable类型:int()&gt; = tuple()
def max_min_counts(data):
max_min = {}
for key,value in data.items():
max_min["max"] = key,value
max_min["min"] = key,value
for key,value in data.items():
if value >= max_min["max"]:
max_min["max"]=key,value
if value <= max_min["min"]:
max_min["min"]=key,value
return max_min
t=max_min_counts(cdc_year_births)
print(t)
和
if value >= max_min["max"]:
我尝试按照Finding the max and min in dictionary as tuples python中的描述从元组中提取值,但无法使其工作。
任何人都可以帮助我制作第二个更短的功能,或者告诉我如何写出更好的功能吗?
非常感谢你。
答案 0 :(得分:4)
您的值是2元组。您需要进一步的索引级别才能使它们起作用:
if value >= max_min["max"][1]:
和
if value <= max_min["min"][1]:
如果您想预设最大/最小值,可以使用float('inf')
和-float('inf')
:
max_min["max"] = (-1, -float('inf')) # Smallest value possible.
max_min["min"] = (-1, float('inf')) # Largest value possible.
您可以使用max
,min
和operator.itemgetter
来有效地执行此操作,以避免lambda
:
from operator import itemgetter
max(cdc_year_births.items(), key=itemgetter(1))
# (2003, 4089950)
min(cdc_year_births.items(), key=itemgetter(1))
# (1997, 3880894)
这是使用reduce
from fuctools import reduce
reduce(lambda x, y: x if x[1] > y[1] else y, cdc_year_births.items())
# (2003, 4089950)
reduce(lambda x, y: x if x[1] < y[1] else y, cdc_year_births.items())
# (1997, 3880894)
items()
生成字典中的元组列表,key
告诉函数在选择最大值/分钟时要比较什么。
答案 1 :(得分:1)
如果您对更具功能性的面向编程的解决方案感兴趣(或者只是具有更多独立组件部分的解决方案),请允许我建议以下内容:
在条目之间建立比较功能
是的,我们可以使用<
/ >
来比较值,因为我们会在dict中进行迭代,但是,正如稍后会明白的那样,它会被&#39有用的东西可以让我们跟踪与出生人数相关的年份。
def comp_births(op, lpair, rpair):
lyr, lbirths = lpair
ryr, rbirths = rpair
return rpair if op(rbirths, lbirths) else lpair
在一天结束时,op
最终将是数字大于或小于数字,但添加此元组业务可实现我们追踪与出生数相关的年份的目标。更进一步,通过将op
分解为函数参数,而不是对运算符进行硬编码,我们打开了重新使用此代码的门,并且#34; min&#34;和&#34; max&#34;变化。
构建您的Prevent winmail.dat in outlook (for gmail accounts)
现在,我们需要做的就是创建一个兼容两年/ num_births对的函数部分应用我们的比较函数:
from functools import partial
from operator import gt, lt
get_max = partial(comp_births, gt)
get_min = partial(comp_births, lt)
get_max((2003, 150), (2012, 400)) #=> (2012, 400)
管道数据
那么我们在哪里可以找到这些年份/ num_births对?事实证明它只是cdc_year_births.items()
。由于我们很懒惰,让我们使用函数为我们进行迭代(reduce
):
from functools import reduce
yr_of_max_births, max_births = reduce(get_max, births.items())
yr_of_min_births, min_births = reduce(get_min, births.items())
答案 2 :(得分:0)
您需要与值进行比较,而不是整个元组:
if value >= max_min["max"][1]:
至于不使用内置函数,您是否反对使用其他内置函数?例如,您可以使用reduce
和一个简单的函数 - x if x[1] < y[1] else y
- 来获得所有条目的最小值。您还可以使用x[1]
作为键对条目进行排序,然后获取排序列表的第一个和最后一个元素。
答案 3 :(得分:0)
是的,我也要参加这个练习。
不使用max和min函数(我们尚未在课程资料中介绍它们),这是困难的方法...
def minimax(dict):
minimax_dict = {}
if(len(dict) == 31):
time = "day_of_month"
elif(len(dict) == 12):
time = "month"
elif(len(dict) == 7):
time = "day_of_week"
else:
time = 'year'
min_time = "min_" + time
max_time = "max_" + time
for item in dict:
if 'min_count' in minimax_dict:
if dict[item] < minimax_dict['min_count']:
minimax_dict['min_count'] = dict[item]
minimax_dict[min_time] = item
else:
minimax_dict['min_count'] = dict[item]
minimax_dict[min_time] = item
if 'max_count' in minimax_dict:
if dict[item] > minimax_dict['max_count']:
minimax_dict['max_count'] = dict[item]
minimax_dict[max_time] = item
else:
minimax_dict['max_count'] = dict[item]
minimax_dict[max_time] = item
return minimax_dict
#here's the test stuff...
min_max_dow_births = minimax(cdc_dow_births)
#min_max_dow_births
min_max_year_births = minimax(cdc_year_births)
#min_max_year_births
min_max_dom_births = minimax(cdc_dom_births)
#min_max_dom_births
min_max_month_births = minimax(cdc_month_births)
#min_max_month_births