python中内部列表元素的列表列表分组
我有一个列表,如:python中内部列表元素的列表列表分组,python,list,Python,List,我有一个列表,如: List = [['Server1','Server2','Server4','Server6','EnvName1','become_a'], ['Server2','Server3','Server1','Server5','EnvName2','become_a'], ['Server4','Server3','Server7','Server6','EnvName3','become_b'], ['Server5','S
List = [['Server1','Server2','Server4','Server6','EnvName1','become_a'],
['Server2','Server3','Server1','Server5','EnvName2','become_a'],
['Server4','Server3','Server7','Server6','EnvName3','become_b'],
['Server5','Server1','Server2','Server3','EnvName4','become_a'],
['Server4','Server2','Server1','Server7','EnvName5','become_b']]
我的列表中包含的是服务器的名称、运行它的环境以及用于在它们上执行ssh的帐户,我想在它们上运行一些shell脚本,但不想在它们上为不同的环境执行冗余ssh连接。所以我想把他们分组。我的分组应该像所有具有相同服务器的EnvNames一样,并且been帐户应该在列表中分组,以便我只在该服务器上执行一次ssh,如果两个EnvNames的服务器相同,但been帐户不同,那么我希望它们位于单独的列表中
我的最终列表应该如下所示:
Final_List = [['Server1','EnvName1,EnvName2,EnvName4','become_a'],
['Server1','Envname5','become_b'],
['Server2','EnvName1,Envname2','become_a'],
['Server2','EnvName5','become_b'],
['Server3','EnvName2,EnvName4','become_a'],
['Server3','EnvName3','become_b'],
['Server4','EnvName1','become_a'],
['Server4','EnvName3,EnvName5','become_b'],
['Server5','EnvName5','become_a'],
['Server6','EnvName1','become_a'],
['Server6','EnvName3','become_b'],
['Server7','EnvName3,EnvName5','become_b']]
我试图对它们进行分组,但结果出了严重错误您希望对服务器和帐户名上的条目进行分组 使用字典进行分组,键入元组:
grouped = {}
for entry in List:
env, account = entry[-2:]
for server in entry[:-2]:
key = server, account
grouped.setdefault(key, []).append(env)
分组后,您可以列出以下内容作为最终输出:
Final_List = [[server] + environments + [account]
for (server, account), environments in sorted(grouped.items())]
这将为环境字符串生成单独的条目。您可以使用以下命令将其放入一个字符串中:
Final_List = [[server, ','.join(environments), account]
for (server, account), environments in sorted(grouped.items())]
演示:
不确定OP是否需要它,但
'EnvName1、EnvName2、EnvName4'
等。。被分为单个组strings@PadraicCunningham:还添加了一个连接名称的选项。
>>> List = [['Server1','Server2','Server4','Server6','EnvName1','become_a'],
... ['Server2','Server3','Server1','Server5','EnvName2','become_a'],
... ['Server4','Server3','Server7','Server6','EnvName3','become_b'],
... ['Server5','Server1','Server2','Server3','EnvName4','become_a'],
... ['Server4','Server2','Server1','Server7','EnvName5','become_b']]
>>> grouped = {}
>>> for entry in List:
... env, account = entry[-2:]
... for server in entry[:-2]:
... key = server, account
... grouped.setdefault(key, []).append(env)
...
>>> [[server] + environments + [account]
... for (server, account), environments in sorted(grouped.items())]
[['Server1', 'EnvName1', 'EnvName2', 'EnvName4', 'become_a'],
['Server1', 'EnvName5', 'become_b'],
['Server2', 'EnvName1', 'EnvName2', 'EnvName4', 'become_a'],
['Server2', 'EnvName5', 'become_b'],
['Server3', 'EnvName2', 'EnvName4', 'become_a'],
['Server3', 'EnvName3', 'become_b'],
['Server4', 'EnvName1', 'become_a'],
['Server4', 'EnvName3', 'EnvName5', 'become_b'],
['Server5', 'EnvName2', 'EnvName4', 'become_a'],
['Server6', 'EnvName1', 'become_a'],
['Server6', 'EnvName3', 'become_b'],
['Server7', 'EnvName3', 'EnvName5', 'become_b']]
>>> [[server, ','.join(environments), account]
... for (server, account), environments in sorted(grouped.items())]
[['Server1', 'EnvName1,EnvName2,EnvName4', 'become_a'],
['Server1', 'EnvName5', 'become_b'],
['Server2', 'EnvName1,EnvName2,EnvName4', 'become_a'],
['Server2', 'EnvName5', 'become_b'],
['Server3', 'EnvName2,EnvName4', 'become_a'],
['Server3', 'EnvName3', 'become_b'],
['Server4', 'EnvName1', 'become_a'],
['Server4', 'EnvName3,EnvName5', 'become_b'],
['Server5', 'EnvName2,EnvName4', 'become_a'],
['Server6', 'EnvName1', 'become_a'],
['Server6', 'EnvName3', 'become_b'],
['Server7', 'EnvName3,EnvName5', 'become_b']]