2

我需要从代表服务器任务的文件中读取行。这些线由几对组成,其中一些是重复的。我需要解析它们,消除重复项并将它们分成 2 组以便更好地执行。这是 aline 的样子:

'task1'->3124, 'task2'->7743, 'task1'->3124, 'task3'->3456, 'task4'->23984

我想获得:

task1 task2
task3 task4

我对 Python 很陌生(只有 C 经验),并且希望在我的代码中使用更多 Python 函数得到一些帮助。这是我当前的代码(仍然不完整,但已经有错误):

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)
4

3 回答 3

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
  • 查找单引号内的所有内容,然后是->一些数字
  • 放入一个集合以消除重复
  • 分成两组,有奇数的地方,留下一个空白字符串''
于 2013-09-11T17:29:01.527 回答
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 个字符的部分,这是为了删除引号。

  • 这会将列表转换为一组唯一元素。

  • 列表

    将集合转换回列表

于 2013-09-11T17:44:27.173 回答
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
于 2013-09-11T17:29:57.763 回答