Stata:生成列表中所有可能的元素对

时间:2015-08-21 09:04:41

标签: combinations stata

我有一个元素列表作为宏,我想生成一个宏,其中包含这些元素的所有可能对,用&符号分隔。例如,有三个元素azbycx

local elementList az by cx

我想动态生成一个包含以下内容的宏pairList:

az&by az&cx by&cx

(一对中两个元素的顺序无关紧要,因此az& by或by& az应该在pairList中,但不能同时在两者中。)

听起来相当简单,但我不确定如何优雅地做到这一点。 (在我的情况下,我有大约十个元素开始。)

2 个答案:

答案 0 :(得分:3)

我同意尼克对这项任务的tuples建议。下面的例子表明你给出的方法稍微优雅一点。

local elementList a b c d e f g h i j k l

local pairList // initialize the list of pairs
local seenList // initialize the list of elements already seen

foreach first of local elementList {
    foreach second of local seenList {
        local pairList `pairList' `second'&`first'
    } 
    local seenList `seenList' `first'
} 
display "List of unique pairs: `pairList'"

答案 1 :(得分:0)

我不知道如何使用我在其他S.O.上找到的递归算法。线程,所以这里是我的“蛮力”方法。绝对不是最优雅但是工作:

local elementList a b c d e f g h i j k l

local pairList // initialize the list of pairs

foreach first in `elementList' {
    foreach second in `elementList' {
        // only do something if the elements are not the same
        if("`first'" != "`second'") { 
            local pair         `first'&`second'    // pair
            local pairReverse  `second'&`first'    // pair in reverse order

            // if pair (or its inverse) is not already in the list, add the pair
            if(strpos("`pairList'","`pair'") == 0 & strpos("`pairList'","`pairReverse'") == 0 ) { 
                local pairList `pairList' `pair'
            }
        } 
    }   // end of loop on second element
} // end of loop on first element
display "List of unique pairs: `pairList'"