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


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.