2013-06-18 3 views
1

Заранее благодарим за любую помощь, которую может предложить любой.Mathematica, групповые пары с общими значениями

Я пытаюсь использовать GatherBy функцию в Mathematica для того, чтобы принять пар в списке a={{1, 4}, {2, 3}, {1, 5}, {2, 5}, {3, 4}, {6, 8}, {6, 7}, {7, 8}} и сортировать по парам, которые содержат значение 1. В идеале, результат будет выглядеть Output={ { {1,4},{1,5} } , {{2, 3}, {2, 5}, {3, 4}, {6, 8}, {6, 7}, {7, 8} } } или нечто подобное, где первый элемент на выходе - список всех элементов в a, содержащий 1, а второй элемент содержит все пары, которые не содержат 1.

Приветствия!

+1

Спасибо вы, Yongyi. Я нашел, что это работает лучше, 'b = GatherBy [a, MemberQ [#, 1] &]', поскольку я буду комбинировать все наборы, которые содержат 1, и поэтому они не будут просто быть парами позже в процессе. Извините, что оставил эту часть. Я полагаю, что в качестве следствия, когда я встаю на группировку на основе значения 4, я использую аналогичную команду 'b = GatherBy [a, MemberQ [#, 4] &] Вывод: {{{6, 8}, { 6, 7}, {7, 8}}, {{1, 4, 5}, {2, 3, 4, 5}}} ' , но я хочу, чтобы список списков, содержащий для отображения, был первым. Любые предложения как? – filup

ответ

1
GatherBy[a, #[[1]] == 1 || #[[2]] == 1 &] 
0

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

a = {{1, 4}, {2, 3}, {1, 5}, {2, 5}, {3, 4}, {6, 8}, {6, 7}, {7, 8}}; 
SortBy[GatherBy[a, MemberQ[#, 2] &], !MemberQ[[email protected]#, 2] &] 

другой подход:

Reap[Sow[ # , MemberQ[#, 2] ] & /@ a, {True, False}] // Last 

Либо дает:

{{{{2, 3}, {2, 5}}}, {{{1, 4}, {1, 5}, {3, 4}, {6, 8}, {6, 7}, {7, 
8}}}}