【问题标题】:Python merge function translated into Matlab not working翻译成 Matlab 的 Python 合并函数不起作用
【发布时间】:2017-08-13 19:27:36
【问题描述】:

对于以下运行良好的 Python 代码

#--------------------------------------------------
s = [[1,2,3],[3,6],[9,0],[0,8]]
s = [set(i) for i in s if i]
t = []
while len(t) != len(s):
    t = s
    s = []
    for i in range(len(t)):
        for j in range(len(s)):
            if not s[j].isdisjoint(t[i]):
                s[j] = s[j].union(t[i])
                break
        else: s.append(t[i])
print(s)
#--------------------------------------------------
>>> [{1, 2, 3, 6}, {0, 9, 8}]
#--------------------------------------------------

我对 Matlab 的翻译为:

%--------------------------------------------------
s = {[1,2,3],[3,6],[9,0],[0,8]};
t = {};
while length(t) ~= length(s)
    t = s;
    s = {};
    for i=1:length(t)
        for j=1:length(s)
            if ~isempty(intersect(s{j},t{i}))
                s{j} = union(s{j},t{i});
                break
            else
                s = [s; t{i}];
            end
        end
        if isempty(s); s = [s; t{i}]; end
    end
end
s{:}
%--------------------------------------------------
ans =
     1     2     3     6
ans =
     0     8     9
ans =
     0     8
%--------------------------------------------------

工作不正确!

问:是什么原因造成的?

参考: Python: simple list merging based on intersections
agf之后的Python代码

【问题讨论】:

    标签: python matlab merge


    【解决方案1】:

    好吧,我可以找到如下解决方案。

    %--------------------------------------------------
    s = {[1,2,3],[3,6],[9,0],[0,8]};
    t = {};
    while length(t) ~= length(s)
        t = s;
        s = {};
        for i=1:length(t)
            for j=1:length(s)
                if ~isempty(intersect(s{j},t{i}))
                    s{j} = union(s{j},t{i});
                    j = 0;
                    break;
                end
            end
            if isempty(s) || (j == length(s));
                s = [s; t{i}];
            end
        end
    end
    s{:}
    %--------------------------------------------------
    ans =
         1     2     3     6
    ans =
         0     8     9
    

    其中j = 0;if isempty(s) || (j == length(s)); 满足else: 与Python 版本一样。

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多