2015-07-11 2 views
0

Если у меня есть список, как это:Python вернуть уникальные элементы комбинации

ls = [['water', 'chips', 'pie'], ['soda', 'nuts', 'cake'], ['water', 'chips', 'cake']] 

Скажет, список попадет в категорию «пить», «закуску», и «пустыня». Я хочу вернуть все уникальные комбинации элементов для «пить» и «перекусить». Список должен вернуть это:

ls = [['water', 'chips'], ['soda', 'nuts']] 

Он не вернется в третий список, потому что water и chips уже существуют в другом списке в ls.

+0

Добавить некоторый ввод, ожидаемый вывод и данные и строку –

+0

Укажите образец данных – Leb

+0

Вы имеете в виду цикл по значениям в каждой строке? Как использовать вложенный цикл? – antonioduarte

ответ

2

Вы можете сделать следующее:

>>> ls = [['water', 'chips', 'pie'], ['soda', 'nuts', 'cake'], ['water', 'chips', 'cake']] 

>>> item_position = { "drink": 0, 
     "snack": 1, 
     "desert": 2} 

>>> set((x[item_position['drink']], x[item_position['snack']]) for x in ls) 
{('soda', 'nuts'), ('water', 'chips')} 

Здесь я создаю item_position dict, который дает положение пищевого продукта t ype во внутреннем списке. Затем я создаю кортеж требуемых предметов, то есть drink и snack, и применим оператор set для фильтрации дубликатов.

Преимущество этого в том, что вы можете просто передать имя типа элемента, не беспокоясь о его индексе. Также вы можете изменить количество элементов внутреннего списка, которые будут использоваться при подготовке кортежа.

+0

Кортеж создается путем включения 'x [item_position ['drink']' и 'x [item_position [ 'snack'] 'в скобках, правильно? – Himmel

+0

Есть ли способ вернуть весь элемент, а не только уникальные элементы? – Himmel

+0

Да, кортеж создается, заключая его в paranthesis. –

1

Вы хотите уникальные значения для каждого списка, кажется. Вы уже на полпути, так как у вас есть набор всех уникальных значений в unqBuilding.

unique_per_row = [list(set(r).difference(unqBuilding)) 
        for r in row] 

Вышеприведенное будет сгенерировать список со списком элементов в каждой строке, которые появляются только в этой строке.

Метод набора принимает другой набор и возвращает новый набор с элементами, которые отображаются только в первом наборе. Это легче понять с помощью диаграммы Венна. На приведенной ниже схеме эквивалент right.difference(left) выделен красным цветом.

Complement

+0

Заботьтесь о нижнем уровне? –

+0

См. Править выше. – Himmel

+0

Хорошо, я ответил перед редактированием ... что угодно. Удачи. –

0

pos0 и Pos1 должны быть переменными в функции, наряду с самим списком, но вы получите идею.

pos0 = 0 
pos1 = 2 

ls = [['water', 'chips', 'pie'], ['soda', 'nuts', 'cake'], ['water', 'chips', 'cake']] 

s = set() 
for row in ls: 
    #cant hash a list, tuple it 

    tu = (row[pos0], row[pos1]) 

    s.add(tu) 
#untuple the set's contents back to lists 
print [list(tu) for tu in s] 

выход: полож 0, 1

[['soda', 'nuts'], ['water', 'chips']] 

поз 0, 2

[['soda', 'cake'], ['water', 'cake'], ['water', 'pie']] 
+0

Без нарезки, как я могу выбрать два элемента, например те, которые имеют индексы 3 и 5 – Himmel

+0

строка [pos0] .Это всего 1 элемент. –

Смежные вопросы