পাইথন ভিতরে তালিকা বোধগম্য গণনা ব্যবহার করে


125

ধরুন আমার কাছে এর মতো একটি তালিকা রয়েছে:

mylist = ["a","b","c","d"]

তাদের সূচক সহ মানগুলি মুদ্রিত করতে আমি পাইথনের enumerateফাংশনটি এর মতো ব্যবহার করতে পারি

>>> for i,j in enumerate(mylist):
...     print i,j
...
0 a
1 b
2 c
3 d
>>>

এখন, যখন আমি এটির ভিতরে এটি ব্যবহার করার চেষ্টা করি তখন list comprehensionএটি আমাকে এই ত্রুটি দেয়

>>> [i,j for i,j in enumerate(mylist)]
  File "<stdin>", line 1
    [i,j for i,j in enumerate(mylist)]
           ^
SyntaxError: invalid syntax

সুতরাং, আমার প্রশ্নটি হল: তালিকাভুক্তির ভিতরে গণনা ব্যবহারের সঠিক উপায়টি কী?

উত্তর:


166

এটা চেষ্টা কর:

[(i, j) for i, j in enumerate(mylist)]

আপনি করা প্রয়োজন i,jকাজ তালিকা ধী জন্য একটি tuple ভিতরে। বিকল্প হিসাবে, enumerate() ইতিমধ্যে একটি tuple রিটার্ন দেওয়া , আপনি প্রথমে আনপ্যাক না করে সরাসরি এটি ফিরে আসতে পারেন:

[pair for pair in enumerate(mylist)]

যেভাবেই হোক, প্রত্যাশার ফলাফলটি প্রত্যাশার মতো:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

4
টিপল হওয়া বাধ্যতামূলক নয়। আই এবং জে ব্যবহার করে যে কোনও অভিব্যক্তি যা মান দেয় সেগুলি করবে
— আলভারো

শুমার ব্যবহার, কিভাবে এটা আরো দক্ষ itertools ব্যবহার তৈরীর সম্পর্কে মহান
— Pramit

3
শুধু মনে রাখবেন যে একটি tuple নির্মাণ করে , না() । সুতরাং " i,jএকটি টিউপল ভিতরে রাখা" কোন লাভ হয় না, যেহেতু i,jইতিমধ্যে একটি tuple! সমস্যা হ'ল তালিকাটি কমপ পার্সারের বিবৃতি গোষ্ঠীর জন্য প্যারেন্স দরকার।
— কাওবার্ট

46

কেবলমাত্র পরিষ্কারভাবে বলতে গেলে, এর সাথে কিছুই করার নেই enumerateএবং তালিকা বোঝার সিনট্যাক্সের সাথে সবকিছু করার আছে।

এই তালিকা অনুধাবন tuples একটি তালিকা ফেরত:

[(i,j) for i in range(3) for j in 'abc']

এই dicts একটি তালিকা:

[{i:j} for i in range(3) for j in 'abc']

তালিকার একটি তালিকা:

[[i,j] for i in range(3) for j in 'abc']

একটি বাক্য গঠন ত্রুটি:

[i,j for i in range(3) for j in 'abc']

যা অসঙ্গতিপূর্ণ (আইএমএইচও) এবং অভিধান বোধগম্য সিনট্যাক্সের সাথে বিভ্রান্তিকর:

>>> {i:j for i,j in enumerate('abcdef')}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}

এবং tuples একটি সেট:

>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])

অস্কার লোপেজ যেমন বলেছিলেন, আপনি কেবল গণনাটির টিপলটি সরাসরি পাস করতে পারবেন:

>>> [t for t in enumerate('abcdef') ] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]

32

অথবা, যদি আপনি একটি তালিকা বোধগম্যতা ব্যবহার করার জন্য জেদ না করেন:

>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

12

আপনি যদি দীর্ঘ তালিকাগুলি ব্যবহার করে থাকেন তবে এটি তালিকা বোধের দ্রুত প্রদর্শিত হবে, বেশি পাঠযোগ্য hen

~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))"
1000000 loops, best of 3: 1.61 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]"
1000000 loops, best of 3: 0.978 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]"
1000000 loops, best of 3: 0.767 usec per loop

2
+1 আমি এটি পরীক্ষা করিনি, তবে আমি বাজি দেব [t for t in enumerate(my list)]এটি আরও দ্রুত।
— নেকড়ে

11

এটি করার একটি উপায় এখানে:

>>> mylist = ['a', 'b', 'c', 'd']
>>> [item for item in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

বিকল্পভাবে, আপনি এটি করতে পারেন:

>>> [(i, j) for i, j in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

আপনি যে কারণে ত্রুটি পেয়েছেন তা হ'ল আপনি চারপাশে () মিস করছেন iএবং jএটিকে একটি টিপল বানাবেন।



0

সমস্ত দুর্দান্ত উত্তর বলছি। আমি জানি যে প্রশ্নটি এখানে গণনার জন্য নির্দিষ্ট, তবে কীভাবে এরকম কিছু, ঠিক অন্য দৃষ্টিকোণ

from itertools import izip, count
a = ["5", "6", "1", "2"]
tupleList = list( izip( count(), a ) )
print(tupleList)

এটি আরও শক্তিশালী হয়ে ওঠে, যদি পারফরম্যান্সের দিক দিয়ে সমান্তরালে একাধিক তালিকাকে পুনরায় করা হয় rate শুধু একটি ভাবনা

a = ["5", "6", "1", "2"]
b = ["a", "b", "c", "d"]
tupleList = list( izip( count(), a, b ) )
print(tupleList)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.