列表中的Python分组

时间:2019-06-18 18:57:07

标签: python-3.x

我正在处理一个文本文件,并且已经通过findall提取了我感兴趣的信息。然后,这些数据会以这样的字符串形式呈现给我:

user1 : null 
user2 : Joe Bob 
user3 : Sandra Sandy 
user4 : John Doe
user5 : Joe Bob 
user6 : John Doe 
user7 : John Doe

或诸如以下列表:

['user1 : null, user2 : Joe Bob , user3 : Sandra Sandy, user4 : John Doe, user5 : Joe Bob, user6 : John Doe, user7 : John Doe']

我想遍历这些内容,并根据第二列将它们分组在一起,例如:

John Doe : user4, user6, user7
Joe Bob: user5, user2
null: user1
Sandra Sandy: user3

最终目标是能够提取“所有者”变量(例如John Doe)并创建票证以表明他具有这些用户。

下面的代码使列表中的经理具有唯一性,并通过user_manager_str对其进行解析并将其相应地分组,但是我仍然没有一种很好的方法来分解它们,因此我可以为每个经理创建唯一的凭单。

# Get a unique list of managers
for i in manager:
    if i not in unique_list:
        unique_list.append(i)

for i in unique_list:
    uniq_manager = i
    #print(uniq_manager)
    for line in user_manager_str.split('\n'):
        if uniq_manager in line:
            #print('Creating SN ticket for ' + uniq_manager)
            print('SN content is: ' + line)

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

使用collections.defaultdict

例如:

from collections import defaultdict 

s = """user1 : null 
user2 : Joe Bob 
user3 : Sandra Sandy 
user4 : John Doe
user5 : Joe Bob 
user6 : John Doe 
user7 : John Doe"""

result = defaultdict(list)
for line in s.splitlines():                        #Iterate each line
    line = line.strip().split(":")                 #Split string by ":"
    result[line[1].strip()].append(line[0].strip())  #Create key-value

for k, v in result.items():
    print(k, ":", ",".join(v))

输出:

 null : user1 
 Joe Bob : user2 ,user5 
 Sandra Sandy : user3 
 John Doe : user4 ,user6 ,user7 

答案 1 :(得分:1)

如果您熟悉pandas库,则可以用更少的行获得更多的灵活性(使用表格数据时):

from io import StringIO
import pandas as pd

s = """user1 : null
user2 : Joe Bob 
user3 : Sandra Sandy 
user4 : John Doe
user5 : Joe Bob 
user6 : John Doe 
user7 : John Doe"""


df = pd.read_csv(StringIO(s), sep='\s+:\s+', engine='python', header=None, keep_default_na=False)
for i, v in df.groupby(1).agg(lambda x: ', '.join(x)).iterrows():
    print(i, ': ', ', '.join(v))

输出:

Joe Bob :  user2, user5
John Doe :  user4, user6, user7
Sandra Sandy :  user3
null :  user1

答案 2 :(得分:0)

使用reitertools.groupby

import re
from itertools import groupby

data = '''user1 : null
user2 : Joe Bob
user3 : Sandra Sandy
user4 : John Doe
user5 : Joe Bob
user6 : John Doe
user7 : John Doe'''

for v, g in groupby(sorted(re.findall(r'(.*?)\s*:\s*(.*)', data), key=lambda k: k[1]), lambda k: k[1]):
    print('{}: '.format(v) + ', '.join(i[0] for i in g))

打印:

Joe Bob: user2, user5
John Doe: user4, user6, user7
Sandra Sandy: user3
null: user1