在dlang中是否有类似python popitem的方法用于关联数组?

时间:2015-06-23 14:00:56

标签: d associative-array

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

key, value = assoc.popitem()

在D中我做:

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

有更好的方法吗?是否可以在foreach之外使用byKeyValue()?

DMD 2.067.1

2 个答案:

答案 0 :(得分:4)

  

是否可以在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

答案 1 :(得分:4)

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

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); 
}   

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