【问题标题】:Is there method like python popitem for associative arrays in dlang?在 dlang 中是否有类似 python popitem 的关联数组的方法?
【发布时间】:2015-09-09 09:05:00
【问题描述】:

我想从关联数组中获取任何键/值对并将其删除。 在python中是:

key, value = assoc.popitem()

在 D 我做:

auto key = assoc.byKey.front;
auto value = assoc[key];
assoc.remove(key);

有没有更好的方法来做到这一点?是否可以在 foreach 之外使用 byKeyValue()?

DMD 2.067.1

【问题讨论】:

  • 是的,您可以在 foreach 之外使用 byKeyValue(),这可能是做您想做的最好的方法。 assoc.byKeyValue().popFront() ...
  • @DejanLekic 你应该这样写作为答案,存储 byKeyValue 范围是一个非常优雅的解决方案。
  • 我太慢了。您和 CyperShadow 的答案已经足够好了。 :)

标签: d associative-array


【解决方案1】:

在考虑之前,我要指出你可以编写一个简单的函数:

import std.typecons;

Tuple!(K, V) popitem(K, V)(ref V[K] arr) { 
    foreach(k, v; arr) { 
        arr.remove(k); 
        return tuple(k, v); 
    } 
    throw new Exception("empty!"); 
} 
void main() { 
    int[string] cool; 
    cool["ten"] = 10; 
    cool["twenty"] = 20; 
    import std.stdio; 
    writeln(cool.popitem()); 
    writeln(cool.popitem()); 
}

或者使用 byKeyValue:

auto popitem(K, V)(ref V[K] arr) { 
    foreach(item; arr.byKeyValue()) { 
        arr.remove(item.key); 
        return item; 
    } 
    throw new Exception("empty!"); 
} 
void main() { 
    int[string] cool; 
    cool["ten"] = 10; 
    cool["twenty"] = 20; 
    import std.stdio; 
    auto item = cool.popitem(); 
    writeln(item.key, item.value); 
    item = cool.popitem(); 
    writeln(item.key, item.value); 
}   

一般来说,我喜欢鼓励人们不要害怕编写自己的函数。如果你可以用一些现有的东西来表达一些东西,只需编写你自己的函数,给它一个你喜欢的名字,然后使用它!使用统一的函数调用语法,您甚至可以轻松地为内置类型编写扩展方法,就像我在这里所做的那样,并像使用它一样使用它。

【讨论】:

  • 您不能在迭代关联数组时对其进行变异。
  • 可能没有定义为继续的行为,但由于循环立即中断,我认为这并不重要。不过,您也可以将键和值存储在局部变量中,然后在完全确定之前从循环中中断。
【解决方案2】:

是否可以在 foreach 之外使用 byKeyValue()?

当然:

import std.stdio;

void main()
{
    int[string] assoc = ["apples" : 2, "bananas" : 4];

    while (!assoc.byKeyValue.empty)
    {
        auto pair = assoc.byKeyValue.front;
        assoc.remove(pair.key);
        writeln(pair.key, ": ", pair.value);
    }
}

有没有更好的方法来做到这一点?

我认为 D 没有与 popitem 等效的库函数。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 2016-06-09
    • 2013-01-03
    • 2013-06-07
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多