2017-11-26 20 views
8

पायथन 3.6.3 क्या लूप का कोई तरीका है हालांकि एक सूची के बाद एक सूची है?एक लूप के साथ अनुक्रमिक रूप से एकाधिक सूचियों के माध्यम से कैसे लूप करें?

उदाहरण के लिए:

deck = [(value, suit) for value in range(2, 11) + 
      ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]] 

(इस मामले में, मैं सही गैर चेहरा कार्ड के बाद चेहरा कार्ड के माध्यम से लूप करना चाहते हैं।)

स्पष्टीकरण के लिए: ऊपर लाइन एक फेंकता है:

TypeError: unsupported operand type(s) for +: 'range' and 'list' 

यह मेरी समस्या है।

+0

आपका उदाहरण अस्पष्ट है। अपेक्षित परिणाम/आउटपुट क्या है? – timgeb

+0

@timgeb उदाहरण में, मैं 52 कार्ड्स का मानक डेक बनाने की कोशिश कर रहा हूं। समस्या यह है कि मैं दूसरे लूप की आवश्यकता के बिना क्रमांकित कार्ड के ठीक बाद {"जे", "क्यू", "के", "ए"} के माध्यम से पुनरावृत्ति करना चाहता हूं। – Josh

+0

@schwobaseggl यह लाइन एक प्रकार की त्रुटि फेंकती है: "TypeError: +: 'range' और 'list' के लिए असमर्थित ऑपरेंड प्रकार (0) – Josh

उत्तर

17

range python3 में एक list वापसी नहीं है, तो range(2, 10) + ["J", "Q", "K", "A"] काम नहीं करता है, लेकिन list(range(2, 10)) + ["J", "Q", "K", "A"] करता है। तुम भी उपयोग कर सकते हैं itertools.chain iterables श्रेणीबद्ध करने के लिए:

from itertools import chain 

chain(range(2, 10), ["J", "Q", "K", "A"]) 
# or even shorter: 
chain(range(2, 10), "JQKA") # as strings themselves are iterables 

# so this comprehension will work 
deck = [ 
    (value, suit) 
    for value in chain(range(2, 10), "JQKA") 
    for suit in "HCDS" 
] 

नेस्टेड समझ है, ज़ाहिर है, एक कार्तीय उत्पाद है जो तुम भी के लिए एक util उपयोग कर सकते हैं का गठन:

from itertools import product 
deck = list(product(chain(range(2, 10), "JQKA"), "HCDS")) 
8

अपने वर्तमान कोड के साथ समस्या यह यहाँ है:

range(2, 10) + ["J", "Q", "K", "A"] 

सबसे पहले, यह, range(2, 11) होना चाहिए अन्यथा, 10 नंबर के साथ कार्ड छोड़े गए हैं। मुझे लगता है यह आप इच्छित दे देंगे

deck = [(value, suit) for value in list(range(2, 11)) + ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]] 

: दूसरा, आदेश रेंज और सूची में शामिल होने के लिए, आपको इतना की तरह करना होगा:

list(range(2, 11)) + ["J", "Q", "K", "A"] 

तो अंतिम परिणाम हो जाएगा आउटपुट (पहले सभी गैर-चेहरे कार्ड, फिर सभी चेहरे कार्ड)।

+1

यह काम करेगा, लेकिन @schwobaseggl के पास itertools का उपयोग करके एक बेहतर समाधान है, क्योंकि इसे किसी सूची की अनावश्यक निर्माण की आवश्यकता नहीं होती है, और उसके बाद कॉन्सटेनेशन की सूची होती है। –

3

python3 में, आप उपयोग कर सकते हैं खोल:

deck = [(value, suit) for value in [*range(2, 10), "J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]] 
+1

वहां 'सूची' कॉल की कोई ज़रूरत नहीं है: '[* रेंज (2, 10)," जे "," क्यू "," के "," ए "] 'पर्याप्त है। (या यहां तक ​​कि '[* रेंज (2, 11), *" JQKA "]'।) –

+0

@ मार्क डिकिंसन को जानना अच्छा है। कृपया मेरा हालिया संपादन देखें। – Ajax1234

5

देखें @ schwobaseggl के समाधान के लिए आप क्या चाहते हैं, लेकिन मैं आम तौर पर एक 2 चरित्र स्ट्रिंग के रूप में कार्ड का प्रतिनिधित्व करने के लिए पसंद है, हालांकि:

deck = [r+s for r in '23456789TJQKA' for s in 'hcds'] 

यह मेरी राय में अधिक पठनीय है, और अभी भी रैंक, सूट के समानता की तरह व्यवहार करेगा।

+0

'*' की आवश्यकता नहीं है – schwobaseggl

2

त्रुटि आप मिलता है में केवल ध्यान केंद्रित:

TypeError: unsupported operand type(s) for +: 'range' and 'list

मैं तुम्हें एक स्पष्टीकरण दे देंगे।

आपके मौजूदा कोड में काम करता है अजगर 2:

deck = [(value, suit) for value in range(2, 11) + ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]] 
print deck 

प्रिंट होगा:

[(2, 'H'), (2, 'C'), (2, 'D'), (2, 'S'), (3, 'H'), (3, 'C'), (3, 'D'), (3, 'S'), (4, 'H'), (4, 'C'), (4, 'D'), (4, 'S'), (5, 'H'), (5, 'C'), (5, 'D'), (5, 'S'), (6, 'H'), (6, 'C'), (6, 'D'), (6, 'S'), (7, 'H'), (7, 'C'), (7, 'D'), (7, 'S'), (8, 'H'), (8, 'C'), (8, 'D'), (8, 'S'), (9, 'H'), (9, 'C'), (9, 'D'), (9, 'S'), (10, 'H'), (10, 'C'), (10, 'D'), (10, 'S'), ('J', 'H'), ('J', 'C'), ('J', 'D'), ('J', 'S'), ('Q', 'H'), ('Q', 'C'), ('Q', 'D'), ('Q', 'S'), ('K', 'H'), ('K', 'C'), ('K', 'D'), ('K', 'S'), ('A', 'H'), ('A', 'C'), ('A', 'D'), ('A', 'S')] 

अजगर 3 में आप का उपयोग करने के list(range(2, 11)):

deck = [(value, suit) for value in list(range(2, 11)) + ["J", "Q", "K", "A"] for suit in ["H", "C", "D", "S"]] 
print(deck) 

पीआर होगा पूर्णांक:

[(2, 'H'), (2, 'C'), (2, 'D'), (2, 'S'), (3, 'H'), (3, 'C'), (3, 'D'), (3, 'S'), (4, 'H'), (4, 'C'), (4, 'D'), (4, 'S'), (5, 'H'), (5, 'C'), (5, 'D'), (5, 'S'), (6, 'H'), (6, 'C'), (6, 'D'), (6, 'S'), (7, 'H'), (7, 'C'), (7, 'D'), (7, 'S'), (8, 'H'), (8, 'C'), (8, 'D'), (8, 'S'), (9, 'H'), (9, 'C'), (9, 'D'), (9, 'S'), (10, 'H'), (10, 'C'), (10, 'D'), (10, 'S'), ('J', 'H'), ('J', 'C'), ('J', 'D'), ('J', 'S'), ('Q', 'H'), ('Q', 'C'), ('Q', 'D'), ('Q', 'S'), ('K', 'H'), ('K', 'C'), ('K', 'D'), ('K', 'S'), ('A', 'H'), ('A', 'C'), ('A', 'D'), ('A', 'S')] 

आप अजगर 3 में list() क्योंकि range() उपयोग करने के लिए अपरिवर्तनीय अनुक्रम प्रकार, नहीं एक सूची बना है है।

संबंधित मुद्दे