টিপলকে তালিকাতে এবং পিছনে রূপান্তর করুন


206

আমি বর্তমানে টাইল মানচিত্র ব্যবহার করে পাইগামে একটি গেমের জন্য মানচিত্র সম্পাদকে কাজ করছি। স্তরটি নীচের কাঠামোর ব্লকগুলি থেকে তৈরি হয়েছে (যদিও এটি অনেক বড়):

level1 = (
         (1,1,1,1,1,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,1,1,1,1,1))

যেখানে "1" হল একটি প্রাচীর যা একটি ব্লক এবং "0" একটি খালি বাতাসের একটি ব্লক।

নিম্নলিখিত কোডটি মূলত ব্লকের ধরণের পরিবর্তনের জন্য পরিচালিত হ'ল:

clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
    currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1

তবে স্তরটি যেহেতু একটি টিপলে সংরক্ষণ করা হয়েছে, তাই আমি বিভিন্ন ব্লকের মান পরিবর্তন করতে অক্ষম। আমি কীভাবে স্তরে বিভিন্ন মানকে সহজ পদ্ধতিতে পরিবর্তন করতে পারি?


12
একটি টিপল ব্যবহার করবেন না, শুরু থেকে কেবল একটি তালিকা ব্যবহার করুন। আপনার স্তরটি যদি বিশাল
আকার ধারণ করে

4
প্রথম থেকেই টিপলগুলির পরিবর্তে তালিকার সাথে কীভাবে যাবেন?
ক্রিজিসটফ বুজনিউইচজ

4
@ user2133308 বিটিডব্লিউ কেবল একটি সামঞ্জস্য নোট, আপনার পাইথন 3 এর //পরিবর্তে পূর্ণসংখ্যা বিভাগ ব্যবহার করা উচিত /, /ভাসমান পয়েন্ট বিভাজন সম্পাদন করবে এবং আপনার কোডটি স্ক্রু করবে up
জামিলাক

উত্তর:


284

তালিকায় রূপান্তর করুন:

>>> t = ('my', 'name', 'is', 'mr', 'tuple')
>>> t
('my', 'name', 'is', 'mr', 'tuple')
>>> list(t)
['my', 'name', 'is', 'mr', 'tuple']

তালিকায় রূপান্তর করুন:

>>> l = ['my', 'name', 'is', 'mr', 'list']
>>> l
['my', 'name', 'is', 'mr', 'list']
>>> tuple(l)
('my', 'name', 'is', 'mr', 'list')

5
এটি আমার জন্য কাজ করছে না। আমি যদি প্রথম ব্লকে কোডটি চালনা করে টিপল টিকে তালিকায় টি-টিকে তালিকা () এ রূপান্তরিত করতে পারি তবে আমি একটি ত্রুটি বার্তা পাই: "*** যুক্তিতে ত্রুটি: '(টি)'" এটি এমনটি বলে মনে হচ্ছে আমাকে কেবল ডিবাগ করার সময়। এখনও বিভ্রান্ত.
জিমি

4
@ জিমি এটি কারণ তালিকাটি একটি ডিবাগার কমান্ড, p list(...)পরিবর্তে চালান ।
মরিৎজ

74

আপনার কাছে টিপলস রয়েছে।
প্রতিটি টিপলকে একটি তালিকায় রূপান্তর করতে:

[list(i) for i in level] # list of lists

--- বা ---

map(list, level)

এবং আপনি সম্পাদনা শেষ করার পরে, কেবল তাদের আবার রূপান্তর করুন:

tuple(tuple(i) for i in edited) # tuple of tuples

--- বা --- (ধন্যবাদ জামিলাক)

tuple(itertools.imap(tuple, edited))

আপনি একটি অদ্ভুত অ্যারেও ব্যবহার করতে পারেন:

>>> a = numpy.array(level1)
>>> a
array([[1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 1, 1, 1, 1, 1]])

কারসাজির জন্য:

if clicked[0] == 1:
    x = (mousey + cameraY) // 60 # For readability
    y = (mousex + cameraX) // 60 # For readability
    a[x][y] = 1

2
পাইথনের সাথে বৈজ্ঞানিক কম্পিউটিংয়ের মৌলিক প্যাকেজ হ'ল নুমপি। নুমপির প্রধান অবজেক্ট হ'ল সমজাতীয় বহুমাত্রিক অ্যারে। এটি উপাদানগুলির একটি টেবিল (সাধারণত সংখ্যা), একই ধরণের সমস্ত ধনাত্মক পূর্ণসংখ্যার একটি দ্বিগুণ দ্বারা সূচিত।
প্রডিয়ুনসগ

24

আপনার তালিকাগুলির একটি তালিকা থাকতে পারে। আপনার টিপলস টিউপলগুলিকে তালিকাগুলির তালিকায় রূপান্তর করুন:

level1 = [list(row) for row in level1]

অথবা

level1 = map(list, level1)

এবং সেই অনুযায়ী তাদের সংশোধন করুন।

তবে একটি অদ্ভুত অ্যারে শীতল।


18

তালিকায় tuples রূপান্তর করতে

(প্রদত্ত প্রশ্নের টিপলগুলির মধ্যে কমাগুলি অনুপস্থিত ছিল, এটি ত্রুটির বার্তা রোধে যুক্ত করা হয়েছিল)

পদ্ধতি 1:

level1 = (
     (1,1,1,1,1,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,1,1,1,1,1))

level1 = [list(row) for row in level1]

print(level1)

পদ্ধতি 2:

level1 = map(list,level1)

print(list(level1))

পদ্ধতি 1 গ্রহণ করেছে --- 0.0019991397857666016 সেকেন্ড ---

পদ্ধতি 2 গ্রহণ করেছে --- 0.0010001659393310547 সেকেন্ড ---


14

আপনি এর ধরণটি টিউপল থেকে কোনও তালিকায় রূপান্তর করার চেষ্টা করছেন না এবং বিপরীতে।

level1 = (
     (1,1,1,1,1,1)
     (1,0,0,0,0,1)
     (1,0,0,0,0,1)
     (1,0,0,0,0,1)
     (1,0,0,0,0,1)
     (1,1,1,1,1,1))

print(level1)

level1 = list(level1)

print(level1)

level1 = tuple(level1)

print(level1)

5

উভয় উত্তর ভাল, কিন্তু একটি সামান্য পরামর্শ:

টিপলস অপরিবর্তনীয়, যা বোঝায় যে এগুলি পরিবর্তন করা যায় না। সুতরাং আপনার যদি ডেটা ম্যানিপুলেট করার দরকার হয় তবে কোনও তালিকায় ডেটা সংরক্ষণ করা ভাল, এটি অপ্রয়োজনীয় ওভারহেড হ্রাস করবে।

আপনার ক্ষেত্রে ইমিরো দেখানো অনুসারে একটি তালিকাতে ডেটা বের করুন এবং সংশোধন করার পরে স্কুলবয়ের উত্তর হিসাবে একই ধরণের কাঠামো তৈরি করতে পারেন।

এছাড়াও নমপি অ্যারে ব্যবহার করার পরামর্শ দেওয়া একটি ভাল বিকল্প


আপনারও এই উত্তরে লিখতে numpyহবে , যা এই ধরণের ডেটা নিয়ে কাজ করার দ্রুততম সমাধান সরবরাহ করবে।
জামিলাক

অবশ্যই আপনি অপরিবর্তনীয় ডেটা স্ট্রাকচারগুলি ব্যবহার করতে পারেন যেমন টিপলস আপনি যখন ডেটা ম্যানিপুলেট করছেন তখনও। ফাংশনাল প্রোগ্রামিংয়ের পুরো ভিত্তি এবং এটি যা মূলত ডেটার অধ্যবসায় গড়ে তোলে। তবে অবশ্যই পাইথন জমিতে আপনি জনসাধারণের সাথে যেতে পারেন এবং নির্দ্বিধায় পরিবর্তন করতে পারেন ...
n23325681

5

নীচে হিসাবে Tuple এবং ফিরে তালিকা করা যেতে পারে

import ast, sys
input_str = sys.stdin.read()
input_tuple = ast.literal_eval(input_str)

l = list(input_tuple)
l.append('Python')
#print(l)
tuple_2 = tuple(l)

# Make sure to name the final tuple 'tuple_2'
print(tuple_2)

2

আপনি যদি তালিকার তালিকার পরিবর্তে মাত্র একটি তালিকা ব্যবহার করেন তবে আপনি নাটকীয়ভাবে আপনার জিনিসগুলি গতি বাড়িয়ে দিতে পারেন। এটি অবশ্যই সম্ভব যদি আপনার সমস্ত অভ্যন্তরীণ তালিকা একই আকারের হয় (যা আপনার উদাহরণে সত্য, সুতরাং আমি কেবল এটি ধরে নিই)।

WIDTH = 6
level1 = [ 1,1,1,1,1,1,
           1,0,0,0,0,1,
           1,0,0,0,0,1,
           1,0,0,0,0,1,
           1,0,0,0,0,1,
           1,1,1,1,1,1 ]
print level1[x + y*WIDTH]  # print value at (x,y)

আপনি যদি তালিকার পরিবর্তে বিটফিল্ড ব্যবহার করেন তবে আপনি আরও দ্রুত হতে পারেন:

WIDTH = 8  # better align your width to bytes, eases things later
level1 = 0xFC84848484FC  # bit field representation of the level
print "1" if level1 & mask(x, y) else "0"  # print bit at (x, y)
level1 |= mask(x, y)  # set bit at (x, y)
level1 &= ~mask(x, y)  # clear bit at (x, y)

সঙ্গে

def mask(x, y):
  return 1 << (WIDTH-x + y*WIDTH)

তবে কেবলমাত্র যদি আপনার ক্ষেত্রগুলিতে 0 বা 1 অবশ্যই থাকে তবে এটি কাজ করছে। আপনার যদি আরও মান দরকার হয় তবে আপনাকে বেশ কয়েকটি বিট একত্রিত করতে হবে যা সমস্যাটিকে আরও জটিল করে তুলবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.