python从多个列表中选择具有引用的最低字母数字值
我有多个这样的列表:python从多个列表中选择具有引用的最低字母数字值,python,list,comparison,tuples,Python,List,Comparison,Tuples,我有多个这样的列表: #Symbol ID ['AAA','MG_00013'] ['AAA','MG_00177'] ['AAA','MG_00005'] ['BBB','MG_0045'] ['BBB','MG_00080'] ['CCC','MG_0002'] # and so on... #Symbol ID ['AAA','MG_00005'] ['BBB','MG_0045'] ['CCC','MG_0002'] #... 我想选择具有相同符号和最小ID的列表 因此,最终结果
#Symbol ID
['AAA','MG_00013']
['AAA','MG_00177']
['AAA','MG_00005']
['BBB','MG_0045']
['BBB','MG_00080']
['CCC','MG_0002'] # and so on...
#Symbol ID
['AAA','MG_00005']
['BBB','MG_0045']
['CCC','MG_0002'] #...
我想选择具有相同符号和最小ID的列表
因此,最终结果如下:
#Symbol ID
['AAA','MG_00013']
['AAA','MG_00177']
['AAA','MG_00005']
['BBB','MG_0045']
['BBB','MG_00080']
['CCC','MG_0002'] # and so on...
#Symbol ID
['AAA','MG_00005']
['BBB','MG_0045']
['CCC','MG_0002'] #...
为了做到这一点,我把它们做成了一个列表
listoflists =[['AAA','MG_00013'],['AAA','MG_00177'],['AAA','MG_00005'],['BBB','MG_0045'],['BBB','MG_00080'],['CCC','MG_0002']]
我从这里迷路了
for i in listoflists:
if i[0] == i[0]:
test.append(i[1])
for i in test:
print(i)
这是一个错误的结果
我认为逻辑是将它们放入如下列表中,比较字母数字ID并选择最低的ID
[(AAA,['MG_00013','MG_00177','MG_00005'])]
然而,我现在完全迷路了,很沮丧
你能帮我处理一下吗
===============================================
每个帮助我的人都太棒了!
但是,必须考虑ID的长度。
例如,每个人都给我带MG_00080的BBB,但它假设MG_0045作为45小于80…我认为像字典这样的东西可能更好,但这将给出您的预期输出
import itertools
listoflists =[['AAA','MG_00013'],['AAA','MG_00177'],['AAA','MG_00005'],['BBB','MG_0045'],['BBB','MG_00080'],['CCC','MG_0002']]
minlists = [
min(value, key=lambda lst: lst[1])
for _, value in itertools.groupby(listoflists, lambda lst: lst[0])
]
print minlists
输出
[['AAA', 'MG_00005'], ['BBB', 'MG_00080'], ['CCC', 'MG_0002']]
编辑:我不清楚ID的比较,但要以数字(而不是词汇)比较它们,请将key=lambda lst:lst[1]
替换为
key=lambda lst: int(lst[1][3:])
我认为像字典这样的东西可能更好,但这会给你预期的输出
import itertools
listoflists =[['AAA','MG_00013'],['AAA','MG_00177'],['AAA','MG_00005'],['BBB','MG_0045'],['BBB','MG_00080'],['CCC','MG_0002']]
minlists = [
min(value, key=lambda lst: lst[1])
for _, value in itertools.groupby(listoflists, lambda lst: lst[0])
]
print minlists
输出
[['AAA', 'MG_00005'], ['BBB', 'MG_00080'], ['CCC', 'MG_0002']]
编辑:我不清楚ID的比较,但要以数字(而不是词汇)比较它们,请将key=lambda lst:lst[1]
替换为
key=lambda lst: int(lst[1][3:])
你可以把它转换成列表字典
d = { k[0] : [] for k in listoflists }
for k in listoflists: d[k[0]].append(k[1])
ans = [ [k,min(d[k])] for k in d ]
print ans
或者只是
d = { k[0] : [] for k in listoflists }
for k in listoflists: d[k[0]].append(k[1])
for k in d: print k,min(d[k])
你可以把它转换成列表字典
d = { k[0] : [] for k in listoflists }
for k in listoflists: d[k[0]].append(k[1])
ans = [ [k,min(d[k])] for k in d ]
print ans
或者只是
d = { k[0] : [] for k in listoflists }
for k in listoflists: d[k[0]].append(k[1])
for k in d: print k,min(d[k])
对于
defaultdict
from collections import defaultdict
D = defaultdict(list)
for k,v in listoflists:
D[k].append(v)
return [[k, min(D[k])] for k in D]
对于
defaultdict
from collections import defaultdict
D = defaultdict(list)
for k,v in listoflists:
D[k].append(v)
return [[k, min(D[k])] for k in D]
保罗,这太棒了,但是ID的长度必须考虑到符号“BBB”对应的ID应该是“MG_0045”而不是“MG_00080”,因为45小于80。。。谢谢,我现在正在尝试解决它。这太棒了,保罗,但是ID的长度必须考虑到符号“BBB”对应的ID应该是“MG_0045”而不是“MG_00080”,因为45小于80。。。谢谢你,我正在努力解决这个问题。字典法对我来说很容易理解。谢谢你@lejlot。然而,保罗·德雷珀的回答也存在同样的问题。必须考虑ID的长度,因为符号“BBB”对应的ID应该是“MG_0045”而不是“MG_00080”,因为45小于80。。。也谢谢你!字典法对我来说很容易理解。谢谢你@lejlot。然而,保罗·德雷珀的回答也存在同样的问题。必须考虑ID的长度,因为符号“BBB”对应的ID应该是“MG_0045”而不是“MG_00080”,因为45小于80。。。也谢谢你!哇,这是如此清晰和错误是固定的。谢谢@Mingyuwow,这是如此清晰,错误已经纠正。谢谢你@明月介绍我DefftDigt真的很棒,这是非常简单的代码,但它不能考虑PSUEDO数值比较的IDS。谢谢。哦,你说得对,我忘了。为此,您将通过<代码> MIN >代码>一个键函数,类似于Paul Draper试图做的。介绍DeFruttDIt真的很棒,这是一个非常简单的代码,但是它不能考虑PSID的IDS的数值比较。谢谢。哦,你说得对,我忘了。为此,您将传递
min
一个键函数,类似于Paul Draper尝试执行的操作。