как выбрать список по определенному значению на 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 шт):
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]]