मैं उपयोग करने की कोशिश कर रहा हूँ 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
वास्तव में एक पुनरावृत्त या अनुक्रम में रिटर्न मान एकत्र करने के लिए है। चूंकि न तो print
न set.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])