Получить первые два элемента из первого подсписка, если первый элемент подсписка уникален в Python - PullRequest
4 голосов
/ 13 июля 2020

У меня есть список:

df = [['apple', 'red', '0.2'], ['apple', 'green', '8.9'], ['apple', 'brown', '2.9'], 
      ['guava', 'green', '1.9'], ['guava', 'yellow', '4.9'], ['guava', 'light green', '2.3']]

Отсюда я хочу получить только первые 2 элемента из первого отдельного подсписка при условии, что значение первого подсписка уникально.

Ожидаемый результат:

df = [['apple', 'red'], ['guava', 'green']]

Код до сих пор:

dummy_list = []

for item in df:
    if item[0] not in dummy_list:        
        dummy_list.append(item[:2])

Это не работает и добавляет все элементы. Любая помощь по этому поводу, пожалуйста

Ответы [ 4 ]

5 голосов
/ 14 июля 2020

Или умнее: используйте dict и setdefault, чтобы добавить сопоставление только для первого

result = {}
for value in df:
    result.setdefault(value[0], value[:2])
result = list(result.values())

print(result)

Или вы можете вести подсчет добавленных ключей, чтобы не повторять их (в отдельном списке)

keys = set()
result = []
for value in df:
    if value[0] not in keys:
        result.append(value[:2])
        keys.add(value[0])

print(result) # [['apple', 'red'], ['guava', 'green']]
2 голосов
/ 14 июля 2020

Вы можете использовать itertools.groupby, а для ключа использовать operator.itemgetter:

from itertools import groupby
from operator import itemgetter

df = [['apple', 'red', '0.2'], ['apple', 'green', '8.9'], ['apple', 'brown', '2.9'], 
      ['guava', 'green', '1.9'], ['guava', 'yellow', '4.9'], ['guava', 'light green', '2.3']]

df1 = [next(g)[:2] for k, g in groupby(df, key=itemgetter(0))]

FYI itemgetter(0) то же самое, что lambda x: x[0], так что вы можете использовать это тоже.

0 голосов
/ 14 июля 2020

вы можете использовать defaultdict для хранения всех значений с использованием пар ключ-значение, а затем выбрать только первое значение из этого списка.

from collections import defaultdict

df = [
    ["apple", "red", "0.2"],
    ["apple", "green", "8.9"],
    ["apple", "brown", "2.9"],
    ["guava", "green", "1.9"],
    ["guava", "yellow", "4.9"],
    ["guava", "light green", "2.3"],
]
temp = defaultdict(list)
for sub_list in df:
    temp[sub_list[0]].append(sub_list)

df = [value[0][:2] for _, value in temp.items()]

print(df)

Вывод:

[['apple', 'red'], ['guava', 'green']]
0 голосов
/ 14 июля 2020

Когда вы говорите уникальный, вы имеете в виду, что если вы выберете значение, вы не захотите выбирать его снова?

Если это так, то pop может быть полезным:

import random as r
df = [['apple', 'red', '0.2'], ['apple', 'green', '8.9'], ['apple', 'brown', '2.9'], 
      ['guava', 'green', '1.9'], ['guava', 'yellow', '4.9'], ['guava', 'light green', '2.3']]

total = len(df)

targetdf = []

for value in range(2):
    position = r.randint(0,total-1)
    targetdf.append(df.pop(position)[:2])
    total-=1

#print(targetdf)

#[['apple', 'green'], ['guava', 'yellow']]

Что делает этот код, так это то, что он выбирает случайную позицию в исходном списке и затем выталкивает ее. Затем это значение сохраняется в новом списке.

...