1

問題:

  • リスト内の各項目の最初の 4 文字を評価しようとしています。
  • 最初の 4 文字がリスト内の別の最初の 4 文字と一致する場合は、最後の 3 桁を最初の 4 桁に追加します。以下の例を参照してください。

ノート:

  • リストの値はハードコーディングされていません。
  • リストは常に「####.###」という構造になっています。
  • リストの各項目の最初の 4 文字のみを一致させる必要があります。
  • 順序は必須ではありません。

コード:

Grid = ["094G.016", "094G.019", "194P.005", "194P.015", "093T.021", "093T.102", "094G.032"]

望ましい出力:

Grid = ["094G.016\019\032", "194P.005\015", "093T.021\102"]

リサーチ:

  • セットが重複を検出できることはわかっています。セットを使用して最初の 4 文字のみを評価できますか? セットのインデックス作成ができないため、問題が発生しますか?

  • リスト項目を 2 つの部分に分割した方がよいでしょうか。ピリオドの前の 4 桁 ("094G") と、ピリオドの後の 3 桁の別のリスト ("093") を比較して、新しいリストに追加しますか?

  • 私が気付いていない、これをすべて一緒に行うより良い方法はありますか?

4

4 に答える 4

3

これを行う簡単な方法の 1 つを次に示します。

from collections import defaultdict

grid = ['094G.016', '094G.019', '194P.005', '194P.015', '093T.021', '093T.102', '094G.032']
d = defaultdict(list)

for item in grid:
    k,v = item.split('.')
    d[k].append(v)

result = ['%s.%s' % (k, '/'.join(v)) for k, v in d.items()]

unordered を与えるresult:

['093T.021/102', '194P.005/015', '094G.016/019/032']
于 2012-07-06T15:43:28.950 に答える
0

最も可能性が高いのは、各コードの最初の部分を 2 番目の部分のリストにマッピングする辞書です。次のように辞書を作成できます。

mappings = {}    #Empty dictionary
for code in Grid:  #Loop over each code
    first, second = code.split('.')   #Separate the code into first.second
    if first in mappings:     #if the first was already found
        mappings[first].append(second)  #add the second to those already computed
    else:
        mappings[first] = [second]   #otherwise, put it in a new list

辞書を取得したら、それをループして 2 番目の部分を結合するのは非常に簡単です (理想的には、 を使用'\\'.join) 。

于 2012-07-06T15:44:40.300 に答える
0

の仕事のようですねdefaultdict

from containers import defaultdict

grid = ["094G.016", "094G.019", "194P.005", "194P.015", "093T.021", "093T.102"]
d = defaultdict(set)

for item in grid:
    prefix, suffix = item.split(".")
    d[prefix].add(suffix)

output = [ "%s.%s" % (prefix, "/".join(d[prefix]), ) for prefix in d ]
于 2012-07-06T15:46:22.950 に答える
0
>>> from itertools import groupby
>>> Grid = ["094G.016", "094G.019", "194P.005", "194P.015", "093T.021", "093T.102", "094G.032"]
>>> Grid = sorted(Grid, key=lambda x:x.split(".")[0])
>>> gen = ((k, g) for k, g in groupby(Grid, key=lambda x:x.split(".")[0]))
>>> gen = ((k,[x.split(".") for x in g]) for k, g in gen)
>>> gen = list((k + '.' + '/'.join(x[1] for x in g) for k, g in gen))
>>> for x in gen:
...     print(x)
...
093T.021/102
094G.016/019/032
194P.005/015
于 2012-07-06T16:04:35.803 に答える