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

dlang中是否有类似python popitem的关联数组方法?,d,associative-array,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 可以在foreach外部使用byKeyValue()吗 当然可以: 有没有更好的办法 我认为D没有与po

我想从关联数组中获取任何键/值对并将其删除。 在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()吗

当然可以:

有没有更好的办法


我认为D没有与
popitem

等效的库函数,在考虑它之前,我要指出,您可以编写一个简单的函数:

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

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

是的,您可以在foreach之外使用byKeyValue(),这可能是实现您所需的最佳方法
assoc.byKeyValue().popFront()
..@DejanLekic你应该写下这个作为答案,存储byKeyValue范围是一个非常优雅的解决方案。我太慢了。您和CyperShadow的答案足够好。:)在对关联数组进行迭代时,不能对其进行变异。可能没有定义要继续的行为,但由于循环立即中断,我认为这无关紧要。尽管如此,您也可以将键和值存储在局部变量中,然后在删除之前中断循环,以确保完全正确。
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); 
}