def chunk(it, size):
it = iter(it)
return iter(lambda: tuple(islice(it, size)), ())
Results = []
values = list(df['values'])
name = list(df['name'])
mergedata = {name_: counts_ for name_, counts_ in zip(name, list(chunk(values, 20)))}
print(mergedata)
for name_, counts in mergedata.items():
if all( 5 < values_ < 16 for values_ in counts ):
Results.append(f'{name_} passed.\n')
else:
Results.append(f'{name_} failed.\n')
我有一个脚本,可从csv文件读取两列。 “名称”和“值”。 然后,基于该值,如果该个人的所有值均为[5,16],则给出通过或失败的结论。但是chunk命令只给我最后一个值。例如:“尼克:5”和“丹:4”。每个人都有20个值分配给他们。我的代码中缺少什么?
chunk(values,20)#分割并打印第一个个体的20个随机值(Nick)例如:Nick:9,3,5,2,6,7,..... chunk(values,1)#块并打印所有个人的最后一个值:例如:“尼克:5”和“丹:4”。
。Name Values
Nick 4
Nick 14
Nick 6
Nick 4
Nick 11
Nick 17
Nick 19
... ...
James 12
James 4
James 1
James 2
James 5
... ...
目标:{Nick:4、14、6、4、11、17、19 ...} 詹姆斯:{詹姆斯:12、4、1、2、5,...}
输出:Nick失败(由于17和19) 詹姆斯通过了
答案 0 :(得分:0)
如果要将列处理为具有累积值的名称的字典,请考虑使用defaultdict
。
给出
import itertools as it
import collections as ct
pred = lambda x : 5 < x < 16
# Sample data (bad + good)
values = list(range(-10, -5)) + list(range(6, 11))
names = ["Nick"] * 5 + ["James"] * 5
代码
def make_dict(names, values):
"""Return a defaultdict of names and listed values."""
data = ct.defaultdict(list)
for name, value in zip(names, values):
data[name].append(value)
return data
def process_dict(data, pred):
"""Return a list of strings; pass if values satisfy the predicate."""
result = []
for name, counts in data.items():
if all(pred(v) for v in counts):
result.append(f"{name} passed.\n")
else:
result.append(f"{name} failed.\n")
return result
演示
d = make_dict(names, values)
d
# defaultdict(list, {'Nick': [-10, -9, -8, -7, -6], 'James': [6, 7, 8, 9, 10]})
process_dict(d, pred)
# ['Nick failed.\n', 'James passed.\n']
详细信息
make_dict()
返回一个名称-值对字典。如果缺少键,defaultdict
将创建一个空列表,因此我们可以安全地附加没有KeyError
的值;这样可以避免分块。process_dict()
使用谓词验证传递的数据。谓词是根据条件,例如,返回True
或False
的函数。 5 < x < 16
。