Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python从多个列表中选择具有引用的最低字母数字值_Python_List_Comparison_Tuples - Fatal编程技术网

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尝试执行的操作。