【发布时间】:2020-06-30 01:43:48
【问题描述】:
我有一个条件列表,如下所示:
mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
结果是:
mylist = [['<', 25],['>', 10]]
基本上它会采用最小数量的 '' 条件。
最好的方法是什么?
【问题讨论】:
标签: python string list conditional-statements logic
我有一个条件列表,如下所示:
mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
结果是:
mylist = [['<', 25],['>', 10]]
基本上它会采用最小数量的 '' 条件。
最好的方法是什么?
【问题讨论】:
标签: python string list conditional-statements logic
您可以使用itertools.groupby按运算符分组,然后根据需要找到第二个值的最小值/最大值:
import itertools
mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
out = [min(g) if k == '<' else max(g) for k, g in itertools.groupby(mylist, key=lambda l:l[0])]
print(out)
输出:
[['<', 25], ['>', 10]]
注意
如果您的列表尚未按运算符排序,则应在使用groupby 之前使用list.sort 对其进行排序:
mylist.sort()
【讨论】:
你可以使用min和max,先用filter过滤目标列表:
mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
result = [min(filter(lambda x:x[0] == '<', mylist)), max(filter(lambda x:x[0] == '>', mylist))]
【讨论】:
您可以尝试使用 min、max 和列表理解:
mylist = [['<', 1000], ['<', 100],['<', 25],['>', 10],['>', 5]]
ls=[min([i for i in mylist if i[0]=='<'],key=lambda x: x[1]),max([i for i in mylist if i[0]=='>'],key=lambda x: x[1])]
print(ls)
您也可以使用sorted:
mylist = [['<', 1000], ['<', 100],['<', 25],['>', 100],['>', 5]]
ls=[sorted(mylist,key=lambda x: (x[0],x[1]))[0],sorted(mylist,key=lambda x: (x[0],x[1]))[-1]]
print(ls)
两个输出:
[['<', 25], ['>', 10]]
【讨论】:
可以用两条这样的快速行来做到这一点:
lower = sorted([ele for ele in mylist if '>' in ele], key=lambda x:x[1])[-1]
upper = sorted([ele for ele in mylist if '<' in ele], key=lambda x:x[1])[0]
print(upper, lower)
输出:
['<', 25] ['>', 10]
甚至:
out = sorted(mylist, key=lambda x: (x[0], x[1]))
print(out[0], out[-1])
输出:
['<', 25] ['>', 10]
【讨论】: