2012-12-06 16 views
9

मेरे पास सूचियों की एक सूची है, सूची में प्रत्येक सूची में 5 आइटम हैं, मैं सूची में आइटम के मूल्य कैसे बदलूं?पायथन - सूचियों की सूची में मूल्य कैसे बदलें?

for [itemnumber, ctype, x, y, delay] in execlist: 
     if itemnumber == mynumber: 
      ctype = myctype 
      x = myx 
      y = myy 
      delay = mydelay 

मूल रूप से मैं tuples की एक सूची थी, लेकिन मैंने महसूस किया कि मैं नहीं कर सकते एक टपल में मूल्यों को बदल तो मैं सूचियों में स्विच लेकिन मैं अभी भी मूल्यों में कोई परिवर्तन नहीं कर सकते: मैं निम्नलिखित की कोशिश की है। अगर मैं लूप के भीतर से टाइप, एक्स, वाई, देरी, मायक्ट टाइप, माइक्स, माई, या माईडेले प्रिंट करता हूं तो ऐसा लगता है कि सबकुछ काम कर रहा है, लेकिन अगर मैं बाद में एक्सक्लिस्ट प्रिंट करता हूं तो मुझे लगता है कि कुछ भी नहीं बदला है।

+0

'itemnumber का अद्वितीय है? या फिर एक और कारण है कि आप पूरी सूची के माध्यम से फिर से शुरू करना चाहते हैं, भले ही प्रतिस्थापन किया जा सके? –

उत्तर

12

समस्या यह है कि आप सूची की एक प्रति बना रहे हैं और फिर प्रतिलिपि को संशोधित कर रहे हैं। आप जो करना चाहते हैं वह मूल सूची को संशोधित करना है। इसके बजाय इसे आजमाएं:

for i in range(len(execlist)): 
    if execlist[i][0] == mynumber: 
     execlist[i][1] = myctype 
     execlist[i][2] = myx 
     execlist[i][3] = myy 
     execlist[i][4] = mydelay 
2

आपको इंडेक्स के माध्यम से असाइन करने की आवश्यकता है। आइए मान लें कि आपको सूचियों की एक सूची मिली है, जहां आंतरिक सूचियों में आपके द्वारा वर्णित 5 आइटम हैं।

l = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] 
for i in l: 
    i[1] = "spam" 

print l 
(output) [[0, "spam", 2, 3, 4], [5, "spam", 7, 8, 9], [10, "spam", 12, 13, 14]] 
0

चर unpacking संदर्भ लेकिन प्रतियां मूल्यों पारित करने के लिए प्रतीत नहीं होता है: यदि आप उन के माध्यम से पुनरावृति और प्रत्येक भीतरी सूची में दूसरे नंबर पर आइटम के मूल्य में परिवर्तन करना चाहते हैं, तो आप की तरह कुछ कर सकता है। एक समाधान इस तरह यह करने के लिए होगा:

foo = [[1, "gggg"], [3, "zzzz"]] 

for item in foo: 
    item[0] = 2 
    item[1] = "ffff" 

print(foo) 

>>>> [[2, 'ffff'], [2, 'ffff']] 
2

आप enumerate() इस्तेमाल कर सकते हैं:

for index, sublist in enumerate(execlist): 
    if sublist[0] == mynumber: 
     execlist[index][1] = myctype 
     execlist[index][2] = myx 
     execlist[index][3] = myy 
     execlist[index][4] = mydelay 
     # break 

आप निकाल सकते हैं # अगर execlist केवल सबसे एक sublist जिसका पहला आइटम mynumber बराबर कर सकते हैं पर होता है; अन्यथा, आप पूरी सूची के माध्यम से बेकार ढंग से चक्र करेंगे।

और यदि itemnumbers वास्तव में अद्वितीय हैं, तो आप अपने डेटा के साथ और क्या करना चाहते हैं, इस पर निर्भर करते हुए, आप एक शब्दकोश या कम से कम OrderedDict के साथ बेहतर हो सकते हैं।

0

सूचियों में स्थानीय चर निर्दिष्ट न करें। पाश

for i in lis: 
    i = 5 

में सिर्फ 5 चर i सेट करता है और सूची में कोई परिवर्तन नहीं की वास्तविक सामग्री छोड़ देता है। इसके बजाय, आप इसे सीधे आवंटित करने के लिए है:

for i in range(len(lis)): 
    lis[i] = 5 

ही, सूची की सूची के लिए आवेदन किया है, हालांकि इस मामले में स्थानीय चर आवंटित करने के लिए ताकि आप for...in निर्माण का उपयोग कर सकते नहीं है।

for i in listoflists: 
    for i2 in range(len(i)): 
      i[i2] = 5 #sets all items in all lists to 5 
0

for में आवंटित चर बदलने से सूची में कोई बदलाव नहीं आता है। यहाँ आप क्या चाहते करने के लिए एक काफी पठनीय तरीका है:

execlist = [ 
    #itemnumber, ctype, x, y, delay 
    [1, 2, 3, 4, 5], 
    [6, 7, 8, 9, 10], 
    [11, 12, 13, 14, 15], 
] 

mynumber, myctype, myx, myy, mydelay = 6, 100, 101, 102, 104 

for i, sublist in enumerate(execlist): 
    if sublist[0] == mynumber: 
     execlist[i] = [mynumber, myctype, myx, myy, mydelay] 

print execlist 

आउटपुट:

[[1, 2, 3, 4, 5], [6, 100, 101, 102, 104], [11, 12, 13, 14, 15]] 
0

इटरेटर चर मूल की प्रतियां (अजगर, हालांकि संरचनाओं जैसे एक संदर्भ की एक अवधारणा नहीं है कर रहे हैं जैसे सूचियों को संदर्भ द्वारा संदर्भित किया जाता है)।आप की तरह कुछ करने की जरूरत है:

for item in execlist: 
    if item[0] == mynumber: 
     item[1] = ctype 
     item[2] = myx 
     item[3] = myy 
     item[4] = mydelay 

item ही एक प्रति भी है, लेकिन यह तो जब आप उसके तत्वों का उल्लेख मूल सूची अद्यतन किया जाता है मूल नेस्टेड सूची के लिए एक संदर्भ की एक प्रति है,।

यह सुविधाजनक नहीं है क्योंकि आपके पास नाम नहीं हैं; शायद एक शब्दकोश या कक्षा एक और सुविधाजनक संरचना होगी।

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