как выбрать список по определенному значению на python?

Как из данного списка:

[
    ['B0375-B', 'B0375', 1, 'B03752', 2], 
    ['B0375-B', 'B0375', 1, 'B03753', 1], 
    ['B0375-B', 'B0375', 1, 'B03752', 1], 
    ['B0375-B', 'B0375', 1, 'B03751', 1], 
    ['B0375-B', 'B0375', 1, 'B03753', 0], 
    ['B0375-B', 'B0375', 1, 'B03752', 0], 
    ['B0375-B', 'B0375', 1, 'B03751', 0]
]

получить такой список:

[
    ['B0375-B', 'B0375', 1, 'B03752', 2], 
    ['B0375-B', 'B0375', 1, 'B03753', 1], 
    ['B0375-B', 'B0375', 1, 'B03751', 1], 
]

Выбирается по самому верхнему, то есть видно для B03752 символы 2, 1, 0 (это не числа, а символы). самый первый (верхний) - 2. поэтому выбираем первый список.


Ответы (1 шт):

Автор решения: strawdog

UPDATED с исправлениями по @Stanislav Volodarskiy

  • Если нравятся циклы, то можно так:
l = [
    ['B0375-B', 'B0375', 1, 'B03752', 2], 
    ['B0375-B', 'B0375', 1, 'B03753', 1], 
    ['B0375-B', 'B0375', 1, 'B03752', 1], 
    ['B0375-B', 'B0375', 1, 'B03751', 1], 
    ['B0375-B', 'B0375', 1, 'B03753', 0], 
    ['B0375-B', 'B0375', 1, 'B03752', 0], 
    ['B0375-B', 'B0375', 1, 'B03751', 0]
]

res = []
count = set()
for i in l:
    if i[3] not in count:
        res.append(i)
        count.add(i[3])

print(res)

[['B0375-B', 'B0375', 1, 'B03752', 2], ['B0375-B', 'B0375', 1, 'B03753', 1], ['B0375-B', 'B0375', 1, 'B03751', 1]]

  • Чуть продвинутее - со словарем:
d1 = dict()
for i in l:
    d1.setdefault(i[3], i)

res = list(d1.values())
print(res)
  • Если порядок результирующего списка не важен, то можно просто через itertools.groupby:
import itertools

res = [list(x[1])[0] for x in itertools.groupby(sorted(l,key=lambda x: x[3]), key=lambda x: x[3])]
print(res)

['B0375-B', 'B0375', 1, 'B03751', 1], ['B0375-B', 'B0375', 1, 'B03752', 2], ['B0375-B', 'B0375', 1, 'B03753', 1]]

  • Можно с помощью pandas, c сохранением порядка:
import pandas as pd
df = pd.DataFrame(l)
res = df.drop_duplicates(3, keep="first").values.tolist()
print(res)

[['B0375-B', 'B0375', 1, 'B03752', 2], ['B0375-B', 'B0375', 1, 'B03753', 1], ['B0375-B', 'B0375', 1, 'B03751', 1]]

  • Можно с помощью numpy:
import numpy as np
v, i = np.unique((np.array(l)[:,3]), return_index=True)
res = [l[x] for x in sorted(i)]
print(res)

[['B0375-B', 'B0375', 1, 'B03752', 2], ['B0375-B', 'B0375', 1, 'B03753', 1], ['B0375-B', 'B0375', 1, 'B03751', 1]]

→ Ссылка