Python 按不同值分组
我有一个值列表,比如元组,比如Python 按不同值分组,python,key,grouping,Python,Key,Grouping,我有一个值列表,比如元组,比如 tmis = [ ( 'script1', 'function1', 'lock1' ), ( 'script1', 'function2', 'lock1' ), ( 'script1', 'function3', 'lock1' ), ( 'script2', 'function4', 'lock1' ), ( 'script3', 'func
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个组,其中每个组仅出现一个特定的“锁”,但如果它们具有相同的“脚本”值,则可以将它们放在同一组中,而不管同一个“锁”是否多次出现。另外,最后一个数据项“script8”有2个“锁”,因此应该位于没有现有“锁1”或“锁2”的组中
它不必是这种格式,我可以使用dictionary/set/tuples/list/任何其他格式。我找到了一种方法,但并不漂亮,所以我想知道是否有一种简单的方法来进行分组
我尝试过(从另一个解决方案中找到)
但这仅按“脚本”值进行分组。有什么想法吗
编辑:我想我的解释不是很清楚。我想做的是对元组进行分组,使具有相同“锁”的两个“脚本”不在同一组中(除非“脚本”相同)
如果有帮助的话,我可以将我目前的(丑陋的)解决方案发布到这里。您的示例与您给出的描述不太相符。例如,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
以下是我的解决方案:
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
对于一个团队来说,“l”键是什么?该组的“l”键是如何唯一的<代码>[('s1','m1','l1'),('s1','m2','l1'),('s1','m3','l1'),('s3','m5','l2'),('s4','m6','l3')]?这个小组的“l”键是什么?我更新了这个问题使它更清楚,希望它能有所帮助。我认为我使用的术语“key”不正确。谢谢,但这会按“lock”值对数据进行分组,实际上我想做的是完全相反的操作,确保任何组都不会出现多个相同的“lock”,除非它们具有相同的“script”名称。
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