我需要从代表服务器任务的文件中读取行。这些线由几对组成,其中一些是重复的。我需要解析它们,消除重复项并将它们分成2组以便更好地执行。这就是aline的样子:
'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984
我想获得:
task1 task2
task3 task4
我是Python的新手(仅限C体验),并希望在我的代码中使用更多pythonic函数。这是我目前的代码(仍然不完整但已经有错误):
def findgroups(s):
group=[]
n=[]
for i in range(len(s)):
group.append(s[i])
if s[i]==',':
n.append(group)
group=[]
return n
def finduniques(groups):
unique=[]
for i in range(len(groups)):
if groups.count(groups[i])==1:
unique.append(groups[i])
return unique
def makegroups(groups):
group1=[]
group2=[]
for i in range(len(groups)):
if i%2==0:
group1.append(groups[i])
if i%2==1:
group2.append(groups[i])
def printgroups(group1, group2):
for i in range(len(group1)):
for j in range(len(group2)):
if i==j:
print group1[0],group2[0]
line = "'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984"
groups = find_groups(line)
uniques = find_uniques(groups)
pairs = makegroups(uniques)
print printgroups(pairs)
答案 0 :(得分:2)
您可以使用:
import re
from itertools import izip_longest
line = "'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984"
tasks = set(re.findall("'(.*?)'->\d+", line))
for t1, t2 in izip_longest(*[iter(tasks)] * 2, fillvalue=''):
print t1, t2
# task1 task2
# task3 task4
->
和一些数字''
答案 1 :(得分:1)
这可以实现你想要的:
>>> import ast
>>> s = "'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984"
>>> d = ast.literal_eval('{' + s.replace('->', ':') + '}')
{'task1': 3124, 'task2': 7743, 'task3': 3456, 'task4': 23984}
>>> it = iter(d)
>>> for first, second in zip(it, it):
print first, second
task1 task2
task3 task4
答案 2 :(得分:1)
欢迎使用python,您只需执行以下操作即可
list(set([l.split('->')[0][1:-1] for l in line.split(', ')]))
这将为您的输入示例
返回以下内容['task1', 'task2', 'task3', 'task4']
分割
这将按给定的字符拆分字符串。这里','和'',所以这将返回所有对
l.split( ' - >')[0]
这将使用引号
拆分对并选择任务名称
l.split( ' - >')[0] [1:-1]
这将从1到len-1个字符中选择任务名称的一部分,这是删除引号。
组
这会将列表转换为一组唯一元素。
列表
将集合转换回列表