Skip to main content
 首页 » 编程设计

python之按不同值分组

2025年05月04日9zlslch

我有一个值列表,现在说元组,例如

    tmis = [ 
           ( 'script1', 'function1', 'lock1' ), 
           ( 'script1', 'function2', 'lock1' ), 
           ( 'script1', 'function3', 'lock1' ), 
           ( 'script2', 'function4', 'lock1' ), 
           ( 'script3', 'function5', 'lock2' ), 
           ( 'script4', 'function6', 'lock3' ), 
           ( 'script5', 'function7', 'lock3' ), 
           ( 'script8', 'function10', 'lock1, lock2' ) 
        ] 

我想使用相同的“脚本”但使用不同的“锁”对我的数据进行分组。

期望的输出:

[  
  [('script1', 'function1', 'lock1'),  
   ('script1', 'function2', 'lock1'),  
   ('script1', 'function3', 'lock1'),  
   ('script3', 'function5', 'lock2'),  
   ('script4', 'function6', 'lock3')], 
  [('script2', 'function4', 'lock1'),  
   ('script5', 'function7', 'lock3')], 
  [('script8', 'function10', 'lock1, lock2')] 
] 

所以我对这个数据的输出是 3 组,其中每个组只有 1 次出现特定的“锁”,但如果它们具有相同的“脚本”值,那么无论多次出现如何,它们都可以放在同一组中相同的“锁”。此外,最后一个数据项“script8”有 2 个“锁”,因此应该在没有现有“锁 1”或“锁 2”的组中。

不一定是这种格式,我可以用dictionary/set/tuples/list/whatever else。我找到了一种方法,但它并不漂亮,所以想知道是否有一种简短的方法来进行这种分组。

我试过了(从另一个解决方案中找到的)

groups = [] 
uniquekeys = [] 
data = sorted(tmis, key=lambda x: x[0] ) 
for k, g in itertools.groupby(data, lambda x: x[0]): 
    groups.append( list(g) ) 
    uniquekeys.append(k) 

但这仅按“脚本”值分组。有什么想法吗?

编辑:我想我的解释不是很清楚。我想要做的是以这样一种方式对元组进行分组,即没有两个具有相同“锁”的“脚本”在同一组中(除非“脚本”相同)

如果有帮助,我可以发布我当前的(丑陋的)解决方案。

请您参考如下方法:

您的示例与您提供的描述不符。例如,s3,l2 和 s4,l3 与 s1,l1 在同一组中。

假设您只是想按照文中所说的去做,而不是想要的输出。这是代码-

tmis = [ 
           ( 's1', 'm1', 'l1' ), 
           ( 's1', 'm2', 'l1' ), 
           ( 's1', 'm3', 'l1' ), 
           ( 's2', 'm4', 'l1' ), 
           ( 's1', 'm5', 'l2' ), 
           ( 's4', 'm6', 'l3' ), 
           ( 's5', 'm7', 'l3' ), 
           ( 's8', 'm10', 'l1, l2' ) 
        ] 
 
d={} 
 
for i in tmis: 
        flag=0 
        if d.has_key(i[2]): 
            d[i[2]].append(i) 
            flag=1 
        else: 
            for key in d.keys(): 
                if d[key][0][0] == i[0]: 
                    d[key].append(i) 
                    flag=1 
                    break 
 
        if flag==0: 
            d[i[2]] = [] 
            d[i[2]].append(i) 
 
print d