簡體   English   中英

處理列表列表,查找所有匹配最后一個值的列表?

[英]Process a list of lists, finding all lists that have matching last values?

給定一個列表列表

lol = [[0,a], [0,b],
       [1,b], [1,c],
       [2,d], [2,e],
       [2,g], [2,b],
       [3,e], [3,f]]

我想提取具有相同最后一個元素( lol[n][1] )的所有子列表,並最終得到如下內容:

[0,b]
[1.b]
[2,b]
[2,e]
[3,e]

我知道給定兩個列表我們可以使用一個交集,除了在每個循環中增加索引值之外,go 的正確方法是什么?

1.使用collections.defaultdict

您可以使用defaultdict將您的項目進行多次分組,然后遍歷dict.items以獲得您需要的內容。

from collections import defaultdict


lol = [[0,'a'], [0,'b'],
       [1,'b'], [1,'c'],
       [2,'d'], [2,'e'],
       [2,'g'], [2,'b'],
       [3,'e'], [3,'f']]


d = defaultdict(list)

for v,k in lol:
    d[k].append(v)

# d looks like - 
# defaultdict(list,
#             {'a': [0],
#              'b': [0, 1, 2],
#              'c': [1],
#              'd': [2],
#              'e': [2, 3],
#              'g': [2],
#              'f': [3]})
    
result = [[v,k] for k,vs in d.items() for v in vs if len(vs)>1]
print(result)
[[0, 'b'], [1, 'b'], [2, 'b'], [2, 'e'], [3, 'e']]

2.使用pandas.duplicated

這是使用 Pandas 的方法 -

  1. 轉換為 pandas dataframe
  2. 對於關鍵列,找到重復項並保留所有項
  3. 在忽略索引的同時轉換為記錄列表
import pandas as pd

df = pd.DataFrame(lol, columns=['val','key'])
dups = df[df['key'].duplicated(keep=False)]
result = list(dups.to_records(index=False))
print(result)
[(0, 'b'), (1, 'b'), (2, 'e'), (2, 'b'), (3, 'e')]

3.使用numpy.unique

您可以使用 numpy 以矢量化方式解決此問題 -

  1. 轉換為 numpy 矩陣arr
  2. 查找唯一元素u及其計數c
  3. 過濾dup出現多次的唯一元素列表
  4. 使用廣播比較數組的第二列並取任何 overaxis=0 以獲得 boolean ,對於重復的行為 True
  5. 根據這個boolean過濾arr
import numpy as np

arr = np.array(lol)

u, c = np.unique(arr[:,1], return_counts=True)
dup = u[c > 1]

result = arr[(arr[:,1]==dup[:,None]).any(0)]
result
array([['0', 'b'],
       ['1', 'b'],
       ['2', 'e'],
       ['2', 'b'],
       ['3', 'e']], dtype='<U21')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM