/ / पायथन मानचित्र () शब्दकोश मूल्य - अजगर, शब्दकोश, लैम्ब्डा

पायथन मानचित्र () शब्दकोश मान - पायथन, शब्दकोश, लैम्ब्डा

मैं उपयोग करने की कोशिश कर रहा हूँ map() पर dict_values ऑब्जेक्ट द्वारा लौटाया गया values() एक शब्दकोश पर काम करते हैं। हालांकि, मैं "करने में सक्षम हो सकता है map() एक से अधिक dict_values:

map(print, h.values())
Out[31]: <builtins.map at 0x1ce1290>

मुझे यकीन है कि ऐसा करने का एक आसान तरीका है। मैं वास्तव में क्या करने की कोशिश कर रहा हूँ एक बना है set() सबका Counter की एक शब्दकोश में चाबियाँ Counters, कुछ इस तरह से:

# counters is a dict with Counters as values
whole_set = set()
map(lambda x: whole_set.update(set(x)), counters.values())

क्या पायथन में ऐसा करने का एक बेहतर तरीका है?

उत्तर:

उत्तर № 1 के लिए 13

पायथन 3 में, map एक पुनरावृति देता है, सूची नहीं। आपको अभी भी इस पर चलना है, या तो कॉल करके list इस पर स्पष्ट रूप से, या इसे एक में डालकर for पाश। लेकिन आपको "टी उपयोग" नहीं करना चाहिए map इस तरह से। map वास्तव में एक पुनरावृत्त या अनुक्रम में रिटर्न मान एकत्र करने के लिए है। चूंकि न तो printset.update का उपयोग कर एक मूल्य देता है map इस मामले में isn "t मुहावरेदार।

अपने लक्ष्य के लिए सभी काउंटरों में सभी चाबियाँ डाल रहा है counters एक ही सेट में। ऐसा करने का एक तरीका एक नेस्टेड जनरेटर अभिव्यक्ति का उपयोग करना है:

s = set(key for counter in counters.values() for key in counter)

वहाँ भी प्यारा तानाशाह समझ वाक्य रचना है, जो पायथन 2.7 और उच्चतर में उपलब्ध है (धन्यवाद Lattyware!) और सेट के साथ ही शब्दकोशों उत्पन्न कर सकते हैं:

s = {key for counter in counters.values() for key in counter}

ये दोनों लगभग निम्नलिखित के बराबर हैं:

s = set()
for counter in counters.values():
for key in counter:
s.add(key)

जवाब के लिए 0 № 2

आप सभी के सेट-यूनियन चाहते हैं counters? अर्थात।,

counters[1].union(counters[2]).union(...).union(counters[n])

? वह सिर्फ functools.reduce:

import functools

s = functools.reduce(set.union, counters.values())


अगर counters.values() aren "t पहले से ही सेट करता है (उदाहरण के लिए, यदि वे" पुनः सूची), तो आपको उन्हें पहले सेट में बदलना चाहिए। आप इसे एक का उपयोग करके कर सकते हैं ताना बाना का उपयोग करते हुए iteritems, जो थोड़ा सांवला है:

>>> counters = {1:[1,2,3], 2:[4], 3:[5,6]}
>>> counters = {k:set(v) for (k,v) in counters.iteritems()}
>>> print counters
{1: set([1, 2, 3]), 2: set([4]), 3: set([5, 6])}

या निश्चित रूप से आप इसे इनलाइन कर सकते हैं, क्योंकि आप इसकी परवाह नहीं करते हैं counters.keys():

>>> counters = {1:[1,2,3], 2:[4], 3:[5,6]}
>>> functools.reduce(set.union, [set(v) for v in counters.values()])
set([1, 2, 3, 4, 5, 6])