如何解决为滚动子列表创建最大和最小列表
我有一个包含子列表的列表:
[{'h': '20','l': '9'},{'h': '30','l': '20'},{'h': '25','l': '7'},{'h': '18','l': '19'},{'h': '22','l': '3'}]
我希望从左到右工作,在剩余子列表(包括当前被引用的子列表)数量不断减少的情况下,找到“h”的最大值和“l”的最小值。结果应该如下。
[{'h': '30','l': '3'},'l': '3'}]
找到整个列表的最大值和最小值很容易,但我无法找出“丢弃”先前存在的最佳方法,而仅在创建新列表时使用剩余的子列表。
解决方法
你可以用 O(n) 解决这个问题。
想象一下你只想解决这个问题的最大值,(解决最小值是一样的),你只需要从列表的末尾迭代到开头,同时保留最大值及其索引,对于你的例子,这个列表是: [(22,4),(25,2),(30,1)]。
那么当你要回答的时候,你会有一个从0到4的循环,当你的计数器小于或等于1时,你的答案是30。之后当你的计数器小于或等于2,您的答案将是 25,然后当您的计数器小于或等于 4 时,您的最大值将是 22。
同样的理论也适用于寻找最小值。
您可以在下面使用我的解决方案代码:
data = [{'h': '20','l': '9'},{'h': '30','l': '20'},{'h': '25','l': '7'},{'h': '18','l': '19'},{'h': '22','l': '3'}]
mx_list = []
mx = 0 # Suppose numbers are Natural
mn_list = []
mn = 1000000 # Suppose it is bigger than all of our numbers
for i,d in enumerate(reversed(data)):
index = len(data) - i - 1
print(int(d['h']))
if int(d['h']) > mx:
mx_list.append((int(d['h']),index))
mx = int(d['h'])
for i,d in enumerate(reversed(data)):
index = len(data) - i - 1
print(int(d['l']))
if int(d['l']) < mn:
mn_list.append((int(d['l']),index))
mn = int(d['l'])
answer_list = []
for i in range(len(data)):
if i <= mx_list[len(mx_list)-1][1]:
cur_mx = mx_list[len(mx_list)-1][0]
else:
mx_list.pop()
cur_mx = mx_list[len(mx_list)-1][0]
if i <= mn_list[len(mn_list)-1][1]:
cur_mn = mn_list[len(mn_list)-1][0]
else:
mn_list.pop()
cur_mn = mn_list[len(mn_list)-1][0]
answer_list.append({'h': cur_mx,'l': cur_mn})
print(answer_list)
,
此代码解决了您的问题:
inp = [{'h': '20','l': '3'}]
l1 = inp[::-1]
l2 = []
max1 = int(l1[0]['h'])
min1 = int(l1[0]['l'])
for item in l1:
max1 = int(item['h']) if int(item['h'])>max1 else max1
min1 = int(item['l']) if int(item['l'])<min1 else min1
l2.append({'h':str(max1),'l':str(min1)})
l2 = l2[::-1]
print(l2)
输出
[{'h': '30','l': '3'},'l': '3'}]
更多信息
首先,我反转输入列表并将其命名为 l1
然后我遍历 l1
将当前的 max1
保存为 h
并将 min1
保存为 {{ 1}}。我在每次迭代中将 l
和 max1
附加到 min1
。最后我反转了 l2
列表。
您可以使用 pandas 来获得一些帮助。首先,您应该将数字转换为整数,因为它们目前是字符串。
l = [{'h': '20','l': '3'}]
l = [{k: int(v) for k,v in x.items()} for x in l]
然后您可以将它们转换为数据帧并使用 cummax
和 cummin
。您必须颠倒顺序才能获得描述方式,然后颠倒输出:
df = pd.DataFrame(l).iloc[::-1]
df['h'] = df['h'].cummax()
df['l'] = df['l'].cummin()
df = df.iloc[::-1]
使用 to_dict
返回原始格式:
df.to_dict('records')
[{'h': 30,'l': 3},{'h': 30,{'h': 25,{'h': 22,'l': 3}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。