2

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

    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 个“锁”,因此应该在一个没有现有“lock1”或“lock2”的组中。

它不必是这种格式,我可以使用字典/集/元组/列表/其他任何东西。我找到了一种方法,但它并不漂亮,所以想知道是否有一种简单的方法来进行这种分组。

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

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)

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

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

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

4

2 回答 2

1

您的示例与您提供的描述不符。例如,您将 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
于 2013-08-29T16:44:58.497 回答
0

这是我的解决方案:

def getscript(group, lock):
    """
    returns the script used by the given lock in the given group
    or None if no script uses the given lock
    """
    for script, function, locks in group:
        if lock in locks.split(', '):
            return script
    return None

def compatible(group, task):
    """
    tells if a task ((script, function, locks) tuple) can be added to a group
    """
    for lock in task[2].split(', '):
        script = getscript(group, lock)
        if script and script != task[0]:
            return False
    return True

def makegroups(tasks):
    groups = []
    for task in tasks:
        try:
            group = next(grp for grp in groups if compatible(grp, task))
        except StopIteration:
            groups.append([task])
        else:
            group.append(task)
    return groups
于 2013-08-30T13:26:19.843 回答