2015-06-23 12 views
5

Chcę uzyskać dowolną parę klucz/wartość z tablicy asocjacyjnej i ją usunąć. W python to:Czy istnieje metoda podobna do python popitem dla tablic asocjacyjnych w dlangu?

key, value = assoc.popitem() 

D robię:

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

Czy istnieje lepszy sposób to zrobić? Czy możliwe jest użycie byKeyValue() poza foreach?

DMD 2.067.1

+0

Tak, możesz użyć byKeyValue() poza foreach i jest to prawdopodobnie najlepszy sposób robienia tego, co chcesz. 'assoc.byKeyValue(). popFront()' ... – DejanLekic

+0

@DejanLekic powinieneś napisać, że jako odpowiedź, przechowywanie zakresu byKeyValue jest całkiem eleganckim rozwiązaniem. –

+0

Byłem zbyt wolny. Odpowiedzi Your i CyperShadow są wystarczająco dobre. :) – DejanLekic

Odpowiedz

4

Czy jest możliwe aby użyć byKeyValue() poza foreach?

Sure:

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

Czy istnieje lepszy sposób to zrobić?

Nie sądzę, że D ma funkcję biblioteczną równoważną dla popitem.

4

Zanim nawet myśleć o tym, bym podkreślić, że można napisać prostą funkcję:

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

lub używając 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); 
} 

Generalnie chciałbym zachęcić ludzi, aby nie bać się pisania własnych funkcji. Jeśli potrafisz wyrazić coś z kilkoma istniejącymi rzeczami, po prostu napisz swoją własną funkcję, nadaj mu nazwę, którą lubisz i użyj tego! Dzięki jednolitej składni wywołań funkcji można z łatwością pisać metody rozszerzania dla wbudowanych typów, tak jak tu zrobiłem i używać go tak, jakby zawsze był.

+0

Nie można zmutować tablicy asocjacyjnej podczas jej iteracji. –

+0

Zachowanie może nie być zdefiniowane, aby kontynuować, ale ponieważ pętla od razu się zrywa, nie sądzę, aby miało to znaczenie. Niemniej jednak można również zapisać klucz i wartość w zmiennej lokalnej, a następnie usunąć z pętli przed usunięciem, aby mieć całkowitą pewność. –