dlang中是否有类似python popitem的关联数组方法?
我想从关联数组中获取任何键/值对并将其删除。 在python中,它是: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
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);
}