是否有可能在Lua中创建一个可以迭代字典的迭代器?

时间:2017-07-02 19:32:41

标签: lua iteration lua-table listiterator

让我们说我在Lua中有一个字典(即一个包含string类型索引的Lua表),如下所示:

local my_dictionary = {a = 123; b = 321; c = 456; d = 654};

我要做的是创建一个迭代器函数,即使其索引的类型为字符串,也可以遍历表。有点像对,但每当我尝试调用next()来获取下一个索引时,值只会返回索引,如果索引的类型为int,则返回值。我的想法可能是调用(索引):byte(1,-1)并将int组成元组,并将其用作一种伪装索引,只是为了跟踪索引,但我不认为这将适用于下一个。这基本上是我到目前为止所做的:

local function each(list)
    if #list > 0 then
        local function my_itr(lst, ind)
            return next(lst, ind);
        end
        return my_itr, List, 0;
    end
    return function() end, nil, nil;
end

这只适用于带有int索引(数组表)的表,所以我想知道是否有人可以帮助我。 谢谢。 编辑:为了使这里不那么模糊,这是我要完成的一段代码示例:

local mytable = {a = 123; b = 321; 3, 2, 1, c = "bca"};
for i,v in each(mytable) do
    print(i,v);
end

它应该输出什么:

>a 123
>b 321
>1 3
>2 2
>3 1
>c bca

输出不必按照确切的顺序排列。

2 个答案:

答案 0 :(得分:2)

您可以使用git push origin master来实现此行为。不要将它与ssh混淆 - 这是两个不同的表遍历函数!

虽然ssh ec2仅遍历表的整数键(通常它也会在第一个不存在的整数键处停止),但pairs遍历所有键值对桌子。

所以,写作

ipairs

您将以某种随机顺序打印所有键值对。这是demo

作为旁注,没有'词典'在Lua中 - 所有关联数组都被称为'表'。

答案 1 :(得分:2)

通过一些调整,它应该完全符合您的要求:修复import matplotlib.pyplot as plt import numpy as np x1 = [1,2,3,4,5,6,7,8,9,10] x2 = [7,3,2,4,1,4,3,5,8,4] y = [0,1,1,0,1,0,0,1,0,1] plt.scatter(x1,x2,c=y, cmap="viridis") yunique = np.unique(y).astype(float) handles = list(map(lambda i: plt.plot([], color=plt.cm.viridis(i),marker="o", ls="")[0], yunique)) labels = list(map(str, yunique.astype(bool))) plt.legend(handles=handles, labels=labels) plt.show() 中的拼写错误并传递List而不是nil

0

这将为我打印以下内容,这是您需要的:

local function each(list)
  local function my_itr(lst, ind)
    return next(lst, ind)
  end
  return my_itr, list, nil
end

local mytable = {a = 123; b = 321; 3, 2, 1, c = "bca"}
for i,v in each(mytable) do
  print(i,v)
end