我正在处理一个文本文件,并且已经通过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)
任何帮助将不胜感激。
答案 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)
使用re
和itertools.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