Как сохранить только определенное количество элементов в списке на основе столбцов, используемых для сортировки? - PullRequest
0 голосов
/ 18 мая 2018

Хорошо, у меня есть список со следующей структурой:

List1=[[a,b,c,data1,e],
[a,b,c,data2,e],
[a,b,c,data3,e],
[a,b,c,data1,e],
[a,b,c,data2,e],
[a,b,c,data3,e],
[a,b,c,data1,e],
[a,b,c,data1,e],
[a,b,c,data2,e],
[a,b,c,data3,e]]

Теперь я отсортировал список, используя:

List1.sort(key=lambda elem: elem[3])

Сгенерированный вывод:

List1=[[a,b,c,data1,e],
    [a,b,c,data1,e],
    [a,b,c,data1,e],
    [a,b,c,data1,e],
    [a,b,c,data2,e],
    [a,b,c,data2,e],
    [a,b,c,data2,e],
    [a,b,c,data3,e],
    [a,b,c,data3,e],
    [a,b,c,data3,e]]

что я хочу достичь - это иметь только 2 элемента для каждого отдельного значения данных, т.е.:

List1=[[a,b,c,data1,e],
    [a,b,c,data1,e],
    [a,b,c,data2,e],
    [a,b,c,data2,e],
    [a,b,c,data3,e],
    [a,b,c,data3,e]]

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Не знаю, правильно ли я вас понял, но попробуйте это:

a = 1
b = 2
c = 3
data1 = 4
data2 = 5
data3 = 6
e = 7

list_1 = [[a, b, c, data1, e],
          [a, b, c, data1, e],
          [a, b, c, data1, e],
          [a, b, c, data1, e],
          [a, b, c, data2, e],
          [a, b, c, data2, e],
          [a, b, c, data2, e],
          [a, b, c, data3, e],
          [a, b, c, data3, e],
          [a, b, c, data3, e]]

list_1.sort(key=lambda elem: elem[3])
for x, _list in enumerate(list_1):
    if x % 2 == 0:
        del list_1[x]

print(list_1)
0 голосов
/ 18 мая 2018
from itertools import groupby, islice, chain
num_to_keep = 2
d = [list(islice(group, num_to_keep)) 
     for key, group in groupby(List1, lambda x: x[3])]
list(chain(*d))

Тот же код расширен с пояснениями

# Group by data
grouped = groupby(List1, lambda x: x[3])
# Keep only the first 2 of each distinct value of data
num_to_keep = 2
d = [list(islice(group, num_to_keep)) for key, group in grouped]
# Flatten list
list(chain(*d))

Обратите внимание, что код сохраняет первые 2 строки с одинаковым значением «data».Однако другие записи могут иметь другие значения.Вы не указали, как бы вы выбрали 2 ряда из них.Кроме того, List1 должен быть отсортирован на основе записи «data», которую вы используете для группировки строк перед выполнением кода.

0 голосов
/ 18 мая 2018

Делает ли это то, что вы хотите?

List1 = [["a", "b", "c", "data1", "e"],
         ["a", "b", "c", "data2", "e"],
         ["a", "b", "c", "data3", "e"],
         ["a", "b", "c", "data1", "e"],
         ["a", "b", "c", "data2", "e"],
         ["a", "b", "c", "data3", "e"],
         ["a", "b", "c", "data1", "e"],
         ["a", "b", "c", "data1", "e"],
         ["a", "b", "c", "data2", "e"],
         ["a", "b", "c", "data3", "e"]]
def group(l,n,key=lambda e:e):
    l = sorted(l,key=key)
    out = l[:n]
    for line in l:
        if key(line) != key(out[-n]):
            out.append(line)
    return out


print(group(List1,2,lambda e:e[3]))

печать:

[['a', 'b', 'c', 'data1', 'e'],
 ['a', 'b', 'c', 'data1', 'e'],
 ['a', 'b', 'c', 'data2', 'e'],
 ['a', 'b', 'c', 'data2', 'e'],
 ['a', 'b', 'c', 'data3', 'e'],
 ['a', 'b', 'c', 'data3', 'e']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...