61279


[一つ前の質問](https://ja.stackoverflow.com/q/61234/19110)の前提に変更点があったので新しく質問させて頂きます。  
前回のリストAの0番目に要素を追加しました。

[code]

    A = [
      [1,'c', 0, 1, 0, 0],
      [0,'d', 1, 1, 0, 1],
      [0,'a', 0, 0, 0, 0],
      [0,'b', 1, 0, 0, 0],
      [0,'c', 0, 1, 0, 0],
      [0,'a', 0, 0, 0, 1],
      [0,'b', 1, 0, 0, 0],
      [0,'d', 1, 0, 0, 1],
    ]
    
[/code]

以下がAというリストに対して行いたい処理です。  
「1番目（アルファベット）は同じだが、0番目または2~5番目（数字）が一致しなければリスト化して抽出する」

最終的に下のようなリストを作りたいです。

[code]

    result = [
     [0,'a', 0, 0, 0, 0],
     [0,'a', 0, 0, 0, 1],
     [0,'c', 0, 1, 0, 0],
     [1,'c', 0, 1, 0, 0],
     [0,'d', 1, 1, 0, 1],
     [0,'d', 1, 0, 0, 1],
    ]
    
[/code]

前の質問でkunifさんから頂いた回答である、以下のプログラムは理解しました。  
これにリストAの0番目の要素も2-5番目の要素も両方参照するという指示を加えるには、どのような変更をしたら良いのでしょうか。

[code]

    A = list(map(list, set(map(tuple, A)))) # 先に重複除去
    A.sort()
    
    result = []
    work = []
    prev = A[0]       # あらかじめ1つ取得・格納
    work.append(prev) #
    
    for i in range(1,len(A)): # 2つ目から始める
        row = A[i]
        if prev[0] != row[0]:       # 先頭データが変わった時
            if len(work) > 1:       # 2つ以上のデータがある時
                result.extend(work) # 結果に追加
    
            work = []               # 作業用配列クリア
    
        prev = row                  # 直前データ更新
        work.append(row)            # 作業用配列に追加
    
    if len(work) > 1:       # 2つ以上の未処理データがある時
        result.extend(work) # 結果に追加
    
[/code]

ご教授お願い致します。


CC BY-SA 4.0
2019-12-09T18:15:00.420
61277
2019-12-09T22:57:42.413
2019-12-09T22:25:26.417
19110
36978
question
python
リスト内の要素を照合し、抽出したい（改訂版）


こちらを参考に、ソートのキーを各行の2つ目のデータに指定します。  
[python sorted
のkeyってなんぞ](https://qiita.com/inon3135/items/70b1ed6706579bd48edf)  
[ソート HOW TO](https://docs.python.org/ja/3/howto/sorting.html)

変更した部分にコメントを入れています。

[code]

    A = list(map(list, set(map(tuple, A))))
    A.sort(key=lambda x:x[1]) # ソートのキーを各行の2つ目のデータに指定
    
    result = []
    work = []
    prev = A[0]
    work.append(prev)
    
    for i in range(1,len(A)):
        row = A[i]
        if prev[1] != row[1]: # 各行の2つ目のデータが変わった時
            if len(work) > 1:
                result.extend(work)
    
            work = []
            prev = row        # 直前データ更新はこの位置の方が良さそう
    
        work.append(row)
    
    if len(work) > 1:
        result.extend(work)
    
[/code]

* * *

**追記**  
上記で`work`リストは、2つ目('a'/'b'/'c'等)の要素が同じである行をいったん貯めておいて、最終的に2行以上あるかチェックして`result`リストに入れるかどうかの判断のための作業用です。  
`prev`はリストといっても常に1個しか入っていませんが、上記「2つ目('a'/'b'/'c'等)の要素が同じである行」かどうかのチェック用に直前データとして格納しておくためのものです。


CC BY-SA 4.0
2019-12-09T18:34:07.367
61279
2019-12-09T22:57:42.413
2019-12-09T22:57:42.413
26370
26370
61277
answer