-4

法的な番号付けスキームに従っている番号のリストがあります

リストは次のようになります -

['1', '1', '1.1', '1.2', '1.3', '1.4', '1.5', '2', '1.6', '2', '2.1', '2.2', '2.3', '2.4', '3', '2.5', '3', '3.1', '3.2', '4', '5', '4', '6', '6.1', '6.2', '9333', '6.3', '6.4', '5', '6.5', '6.6', '6.7', '6.8', '6.9', '6.10', '6', '7']

ただし、このリストには「整数」の侵入者 (スキームと一致しない数値) があります。たとえば、リストの一番上にある最初の '1' は、'1.6' の前にある '2' です。矛盾した数値を特定してリストから削除するための既知のアルゴリズムまたはパターンはありますか?

編集:質問が明確でない人もいるので、法的な番号付けスキームがどのように見えるかを投稿しました:

['1','1.1','1.2','1.3','2','2.1','3','3.1','3.2'....]

ただし、これは単なる番号付けスキームであるため、これを静的リストと比較することはできません。「2」の後に「2.1」が続き、「3」に戻るか、「2.1」、「2.2」が続き、「3」に戻る可能性があります。

4

3 に答える 3

4
for a,b in zip(mylist, mylist[1:]):
    if a==b:
        print('Value {} is repeated'.format(a))
    elif a > b:
        print('Either {} or {} is out of order'.format(a,b))

あなたのデータでは、これは

Value 1 is repeated
Either 2 or 1.6 is out of order
Either 3 or 2.5 is out of order
Either 5 or 4 is out of order
Either 9333 or 6.3 is out of order
Either 6.4 or 5 is out of order
Either 6.9 or 6.10 is out of order
Either 6.10 or 6 is out of order

あるいは、

mylist = sorted(set(mylist))

自動的に重複を取り除き、すべてを整理します。

編集: Mark Byers は、6.9 / 6.10 が正しくソートされていないことについて良い点を指摘しています。私が見る唯一の解決策は、文字列を解析して、次のように整数を比較することです。

mylist = sorted(set(mylist), key=lambda s:map(int, s.split('.')))

結果は

['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6', '2', '2.1', '2.2', '2.3', '2.4', '2.5', '3', '3.1', '3.2', '4', '5', '6', '6.1', '6.2', '6.3', '6.4', '6.5', '6.6', '6.7', '6.8', '6.9', '6.10', '7', '9333']
于 2012-07-06T20:35:32.870 に答える
2

基本的に、リストのソートされたバージョンと比較したい

for a, b in zip(numbers, sorted(numbers, key=lambda x: x.split('.'))):
    if a != b:
       print('error at ' + a)
       # or do something else
于 2012-07-06T19:34:49.907 に答える
1

これを試して:

def get_next_dotted_term(s, i):
    for x in s[i + 1:]:
        if '.' in x:
            return int(x.partition('.')[0])

def make_valid(s):
    result = []
    current = 0

    for i, x in enumerate(s):
        if '.' in x:
            result.append(x)
        else:
            ix = int(x)
            nextdot = get_next_dotted_term(s, i)
            if current + 1 == ix and (ix <= nextdot or not nextdot):
                result.append(x)
                current += 1
            else:
                print "Error: " + x
    return result

print make_valid(['1','1.1','2','1.2','2','3','3.1','3.2','4','3.3','3.4'])

結果:

エラー:2
エラー:4
['1'、 '1.1'、 '1.2'、 '2'、 '3'、 '3.1'、 '3.2'、 '3.3'、 '3.4']
于 2012-07-08T12:07:32.193 に答える