2

次のリストのリストがあります。

sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]

リストのリストを反復処理し、サブリストのさまざまなグループを # 文字で区切りたい、つまり、サブリスト文字列の最初の要素が変更されたときに # を挿入したい。

望ましい結果

>>sweet
>>[['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], '#', ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]

些細な作業かもしれませんが、私は Python に非常に慣れていません。

編集

おそらく辞書の方が優れたデータ構造になるので、「#」キーは必要ないかもしれないことを認識しています。それを駅の区切り文字(文字列の最初の数字)として使用することを目指していました。リストを反復処理しながら、ステーションを分離して計算します。

あなたが見る私の目標は、リストを反復処理し(それを辞書にする必要があります)、重要な最初の各数値内のintのリストのペア間の差を計算することです。望ましい最終結果: {'1234': [[-38, 11, -4, 11, 23], [40, -5, 5, 6, -1]] '1567':[[3, 4, 7、11、-2]]}

これに関するヘルプも大歓迎です:)

4

6 に答える 6

2

あなたのデータは辞書として整理されているようです。そのようです:

sweet = {'1234-4321-1': [5, 6, -4, 11, 22], 
         '1234-7834-1': [43, -5, 0, 0, -1],
         '1234-5376-1': [3, 0, -5, -6, 0],
         '1567-3454-1': [4, 6, 8, 3, 3],
         '1567-9987-1': [1, 2, 1, -4, 5] }

次に、最初のリストを返すように、キーで要素にアクセスできます。sweet['1234-4321-1']

または、最初の数値が分割するための重要な要素であるように思われるため、もう少し複雑なもの:

sweet = {'1234': [['4321-1', [5, 6, -4, 11, 22]], 
                  ['7834-1', [43, -5, 0, 0, -1]],
                  ['5376-1', [3, 0, -5, -6, 0]]],
         '1567': [['3454-1', [4, 6, 8, 3, 3]],
                 ['9987-1', [1, 2, 1, -4, 5]]] 
        }

と言うsweet['1234']と、インデックスでアドレス指定できるペアのリストが表示されます。 sweet['1234'][0]リストの最初のエントリを与える。

そうは言っても、次のようにして「#」を挿入できます。

sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]

skip = False
for i in range(len(sweet)-1):
    if skip: #skip over the '#' that was just inserted
            skip = False
            continue
    front_num_1 = sweet[i][0].split('-')[0]
    front_num_2 = sweet[i+1][0].split('-')[0]
    if front_num_1 != front_num_2:
        sweet.insert(i+1, '#')
        skip = True

print sweet

しかし、他の誰もが説明したように、このデータ構造は弱いようです。

于 2012-08-07T15:58:01.800 に答える
1

これはあなたが望むことをしますが、エレガントな方法ではありません(私はPythonを初めて使用します)

sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
ans=[]
j=sweet[0][0].split('-')[0]
for i in sweet:
    print i
    if i[0].split('-')[0]!=j:
        ans.append("#")
    ans.append(i)
    j=i[0].split('-')[0]
sweet=ans
于 2012-08-07T15:50:30.013 に答える
1

これでタスクは完了しますが、データ構造が適切に選択されていないと思います。

new_sweet = sweet[0]
for s in sweet[1:]:
    if s[0].split('-')[0] != new_sweet[-1][0].split('-')[0]:
       new_sweet.append('#')
    new_sweet.append(s)
于 2012-08-07T15:51:04.567 に答える
1
f = lambda l: l[0].split('-')[0]
indexes = (i for i in range(1, len(sweet)) if f(sweet[i]) != f(sweet[i-1]))
for i, j in enumerate(indexes):
    sweet.insert(i+j, '#')
于 2012-08-07T15:54:43.903 に答える
0
    for i in range(len(s)-1):
          a,b=s[i][0][:4], s[i+1][0][:4]
          if a!=b:
             s.insert(i+1,"#")
             break
于 2012-11-06T19:20:25.080 に答える
0
>>> from itertools import groupby, chain
>>> def join(iterable, delimiter):
        i = iter(iterable)
        yield next(i)
        for el in i:
            yield delimiter
            yield el


>>> sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
>>> groups = (g for k, g in groupby(sweet, lambda x: x[0].partition('-')[0]))
>>> list(chain.from_iterable(join(groups, delimiter='#')))
[['1234-4321-1', [5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], '#', ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
于 2012-08-08T04:16:00.430 に答える