2013-11-25 2 views
0

Я пытаюсь выяснить способ идентификации комбинаций предметов, упорядоченных вместе из списка заказов (заказ задается идентификатором заказа) и их счет. Например, в следующем списке планшет и ноутбук заказываются вместе дважды.Самый быстрый способ определения комбинаций предметов

ID ITEM 
==== ===== 
1  Phone 
1  Mp3 Player 
2  Mp3 Player 
2  headphone 
2  laptop 
2  tablet 
3  tablet 
3  laptop 

Ниже приведены различные комбинации (только принимая 2 в то время) и их подсчет:

Phone, Mp3 player - count:1 
Mp3 player, headphone - count:1 
Mp3 player, laptop - count:1 
Mp3 player, tablet - count:1 
headphone, laptop - count:1 
headphone, tablet - count:1 
tablet, laptop - count:2 

Как запрограммировать это в VB.net/python/javascript без непрерывного зацикливание?

* (Advance Извинения для Я новичок, так и кодирования стека переполнения)

+0

Извините, но я не понимаю, что такое «общая комбинация»? Почему вам не хватает некоторых перестановок, таких как «Телефон, планшет» или «Телефон, ноутбук», и я не понимаю, что вы подразумеваете под «заказом в том же порядке». Вам нужно будет лучше описать, что вы пытаетесь сделать, прежде чем кто-либо сможет помочь. – jfriend00

+0

Почему бы не «Телефон, ноутбук» и другие? –

+0

Зачем вам эти комбинации? Откуда идет исходная информация - вход пользователя, база данных и т. Д. – jeff

ответ

2

Я вижу, что вы делаете, но вы указали это довольно плохо. Вы выполняете как операцию group (на основе идентификатора), а затем комбинацию операция аналогичных элементов с тем же идентификатором.

В питона:

li = [(1,'Phone'),(1,'MP3 Player'),(2,'MP3 Player'),(2,'headphone'),(2,'laptop'),(2,'tablet'),(3,'tablet'),(3,'laptop')] 

from itertools import groupby, combinations 

[list(combinations(g,2)) for _,g in groupby(li,lambda x: x[0])] 
Out[10]: 
[[((1, 'Phone'), (1, 'MP3 Player'))], 
[((2, 'MP3 Player'), (2, 'headphone')), 
    ((2, 'MP3 Player'), (2, 'laptop')), 
    ((2, 'MP3 Player'), (2, 'tablet')), 
    ((2, 'headphone'), (2, 'laptop')), 
    ((2, 'headphone'), (2, 'tablet')), 
    ((2, 'laptop'), (2, 'tablet'))], 
[((3, 'tablet'), (3, 'laptop'))]] 

Если вы хотите напечатать, что в более удобочитаемом формате, как ваш выход, сделать:

output = [list(combinations(g,2)) for _,g in groupby(li,lambda x: x[0])] 
for id_ in output: 
    for combo in id_: 
     print([x[1] for x in combo]) 

['Phone', 'MP3 Player'] 
['MP3 Player', 'headphone'] 
['MP3 Player', 'laptop'] 
['MP3 Player', 'tablet'] 
['headphone', 'laptop'] 
['headphone', 'tablet'] 
['laptop', 'tablet'] 
['tablet', 'laptop'] 

Или, форматирование точно,

for id_ in output: 
    for combo in id_: 
     print('{}, {}'.format(*[x[1] for x in combo])) 

Phone, MP3 Player 
MP3 Player, headphone 
MP3 Player, laptop 
MP3 Player, tablet 
headphone, laptop 
headphone, tablet 
laptop, tablet 
tablet, laptop 
+0

Спасибо rioppi. Любые мысли о том, как это сделать? Например (ноутбук, планшет = планшет, ноутбук)? – Braggy

+0

@Braggy: Но '('laptop', 'tablet')' должно быть в списке - оба имеют ID '2'. –

+1

@Braggy Вы только что добавили какую-то спецификацию «счет» на свой вопрос. Я не буду обращаться к этому. Я призываю вас сыграть с вышеуказанным кодом и изучить методы слияния двух коллекций вещей в разном порядке. (подсказка: 'set') – roippi

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