2

サーバー タスクを表すファイルから行を読み取る必要があります。線はいくつかのペアで構成されており、そのうちのいくつかは複製されています。それらを解析し、重複を排除し、実行を改善するためにそれらを 2 つのグループに分割する必要があります。これは、アラインがどのように見えるかです:

'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)
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
  • 一重引用符で囲まれ、その後に->いくつかの数字が続くものをすべて検索します
  • 重複を排除するためにセットに入れます
  • 2 つにグループ化し、奇数の場合は空白の文字列を残します''
于 2013-09-11T17:29:01.527 に答える
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 に答える
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 に答える