loop - tuple in python




الحصول على العنصر الأخير من قائمة في بيثون (9)

في Python ، كيف تحصل على العنصر الأخير من القائمة؟

للحصول فقط على العنصر الأخير ،

  • دون تعديل القائمة و
  • بافتراض أنك تعرف أن القائمة بها عنصر أخير (أي أنها غير فارغة)

تمرير -1 إلى تدوين منخفض:

>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'

تفسير

الفهارس والشرائح يمكن أن تأخذ الأعداد الصحيحة السالبة كوسيطة.

لقد قمت بتعديل مثال من الوثائق للإشارة إلى العنصر الموجود في تسلسل يشير إليه كل فهرس ، في هذه الحالة ، في السلسلة "Python" ، يشير إلى العنصر الأخير ، الحرف ، 'n' :

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
   0   1   2   3   4   5 
  -6  -5  -4  -3  -2  -1

>>> p = 'Python'
>>> p[-1]
'n'

احالة عبر تفريغ iterable

قد تتجسد هذه الطريقة دون داعٍ في قائمة ثانية لأغراض الحصول على العنصر الأخير فقط ، ولكن من أجل الاكتمال (وبما أنها تدعم أي تكرارات - وليس فقط قوائم):

>>> *head, last = a_list
>>> last
'three'

اسم المتغير ، الرأس مرتبط بالقائمة المنشأة الجديدة غير الضرورية:

>>> head
['zero', 'one', 'two']

إذا كنت تنوي ألا تفعل شيئًا في هذه القائمة ، فسيكون هذا أكثر ملاءمة:

*_, last = a_list

أو ، إذا كنت تعرف أنها قائمة (أو على الأقل تقبل ترميز منخفض):

last = a_list[-1]

في وظيفة

قال أحد المعلقين:

كنت أتمنى أن يكون لبيثون وظيفة لأول () وآخر () مثلما يفعل ليسب ... سوف يتخلص من الكثير من وظائف لامدا غير الضرورية.

سيكون من السهل تحديد ذلك:

def last(a_list):
    return a_list[-1]

def first(a_list):
    return a_list[0]

أو استخدم operator.itemgetter :

>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)

في كلا الحالتين:

>>> last(a_list)
'three'
>>> first(a_list)
'zero'

حالات خاصة

إذا كنت تفعل شيئًا أكثر تعقيدًا ، فقد تجده أكثر فاعلية للحصول على العنصر الأخير بطرق مختلفة قليلاً.

إذا كنت حديث العهد بالبرمجة ، فيجب عليك تجنب هذا القسم ، لأنه يزاوج بين الأجزاء المختلفة من الخوارزميات. إذا قمت بتغيير الخوارزمية الخاصة بك في مكان واحد ، فقد يكون لها تأثير غير مقصود على سطر آخر من التعليمات البرمجية.

أحاول تقديم التحذيرات والظروف بشكل كامل قدر الإمكان ، لكن ربما فاتني شيء ما. يرجى التعليق إذا كنت تعتقد أنني سأترك تحذيرا.

تشريح

ترجع شريحة من القائمة قائمة جديدة - حتى يمكننا قطع من -1 إلى النهاية إذا أردنا العنصر في قائمة جديدة:

>>> a_slice = a_list[-1:]
>>> a_slice
['three']

هذا الاتجاه الصاعد لا يفشل إذا كانت القائمة فارغة:

>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
...     do_something(tail)

في حين أن محاولة الوصول عن طريق فهرس يزيد على IndexError التي تحتاج إلى التعامل معها:

>>> empty_list[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

ولكن مرة أخرى ، يجب إجراء التقسيم لهذا الغرض فقط إذا كنت بحاجة إلى:

  • قائمة جديدة تم إنشاؤها
  • وتكون القائمة الجديدة فارغة إذا كانت القائمة السابقة فارغة.

للحلقات

كميزة من بيثون ، لا يوجد فحص داخلي في حلقة for .

إذا كنت تقوم بتكرار كامل على القائمة بالفعل ، فسيستمر الإشارة إلى العنصر الأخير من خلال اسم المتغير الذي تم تعيينه في الحلقة:

>>> def do_something(arg): pass
>>> for item in a_list:
...     do_something(item)
...     
>>> item
'three'

هذا ليس دلاليًا آخر شيء في القائمة. هذا هو لغوي آخر شيء أن اسم ، item ، كان منضما إليه.

>>> def do_something(arg): raise Exception
>>> for item in a_list:
...     do_something(item)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 1, in do_something
Exception
>>> item
'zero'

وبالتالي يجب استخدام هذا فقط للحصول على العنصر الأخير إذا كنت

  • هي بالفعل حلقات ، و
  • أنت تعلم أن الحلقة ستنتهي (لا تنقطع أو تخرج بسبب أخطاء) ، وإلا فإنها ستشير إلى العنصر الأخير المشار إليه في الحلقة.

الحصول عليها وإزالتها

يمكننا أيضًا تغيير القائمة الأصلية عن طريق إزالة العنصر الأخير وإعادته:

>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']

ولكن الآن يتم تعديل القائمة الأصلية.

( -1 هي في الواقع الوسيطة الافتراضية ، لذلك يمكن استخدام list.pop بدون وسيطة فهرس):

>>> a_list.pop()
'two'

تفعل هذا فقط إذا

  • تعلم أن القائمة تحتوي على عناصر بها ، أو تكون على استعداد للتعامل مع الاستثناء إذا كانت فارغة ، و
  • أنت تنوي إزالة العنصر الأخير من القائمة ، بمعالجته كدليل.

هذه حالات استخدام صالحة ، ولكنها ليست شائعة جدًا.

حفظ بقية العكس لوقت لاحق:

لا أعرف لماذا كنت ستفعل ذلك ، ولكن للتأكد من اكتمالها ، بما أن reversed يُرجع مكررًا (يدعم بروتوكول التكرار) ، فيمكنك تمرير النتيجة إلى next :

>>> next(reversed([1,2,3]))
3

إذن ، مثلما تفعل عكس ذلك:

>>> next(iter([1,2,3]))
1

لكن لا يمكنني التفكير في سبب وجيه للقيام بذلك ، إلا إذا كنت ستحتاج إلى بقية المحاكي الخلفي في وقت لاحق ، الأمر الذي قد يبدو أكثر كالتالي:

reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)

use_later = list(reverse_iterator)

و الأن:

>>> use_later
[2, 1]
>>> last_element
3

في Python ، كيف تحصل على العنصر الأخير من القائمة؟


some_list = [1 ، 2 ، 3]

طريقة 1:

some_list[-1]

الطريقة الثانية:

**some_list.reverse()** 

**some_list[0]**

الطريقة الثالثة:

some_list.pop() 

إذا كانت لديك str () أو قائمة () كائنات قد ينتهي فارغة مثل: astr = '' أو alist = [] ، ثم قد ترغب في استخدام alist[-1:] بدلاً من alist[-1] للكائن " التشابه ".

أهمية هذا هو:

alist = []
alist[-1]   # will generate an IndexError exception whereas 
alist[-1:]  # will return an empty list
astr = ''
astr[-1]    # will generate an IndexError exception whereas
astr[-1:]   # will return an empty str

حيث يكون التمييز الذي يتم إجراؤه هو أن إرجاع كائن قائمة فارغ أو كائن str فارغ هو أكثر "عنصر آخر" - مثل كائن استثناء.


إذا كنت تريد فقط الحصول على آخر قيمة للقائمة ، يجب عليك استخدام:

your_list[-1]

ولكن إذا كنت ترغب في الحصول على القيمة وإزالتها أيضًا من القائمة ، فيمكنك استخدام:

your_list.pop()

أو: يمكنك البوب ​​مع الفهرس أيضا ...

your_list.pop(-1)

حسنًا ، ولكن ماذا عن items[len(items) - 1] الشائعة في كل items[len(items) - 1] اللغوية تقريبًا items[len(items) - 1] ؟ هذا هو IMO أسهل طريقة للحصول على العنصر الأخير ، لأنه لا يتطلب أي معرفة pythonic .


يمكنك أيضًا استخدام التعليمة البرمجية أدناه ، إذا كنت لا ترغب في الحصول على IndexError عندما تكون القائمة فارغة.

next(reversed(some_list), None)

list[-1] سيتم استرداد العنصر الأخير من القائمة دون تغيير القائمة. سوف list.pop() استرداد العنصر الأخير من القائمة ، لكنها سوف تتحول / تغيير القائمة الأصلية. عادة ، لا ينصح بتحور القائمة الأصلية.

بدلاً من ذلك ، إذا كنت تبحث عن شيء أقل من ذلك ، لسبب ما ، يمكنك استخدام list[len(list)-1] ، بافتراض أن القائمة ليست فارغة.


some_list[-1] هو الأقصر والأشهر.

في الواقع ، يمكنك أن تفعل أكثر بكثير مع هذا النحو. يحصل بناء الجملة some_list[-n] على عنصر nth-to-last. وهكذا some_list[-1] على العنصر الأخير ، some_list[-2] يحصل some_list[-2] على الثانية إلى الأخيرة ، وما إلى ذلك ، وصولاً إلى some_list[-len(some_list)] ، والذي يمنحك العنصر الأول.

يمكنك أيضًا تعيين عناصر القائمة بهذه الطريقة. على سبيل المثال:

>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]

popes = ['john paul II', 'benedict XIV', 'francis I']
current_pope = []
for pope in popes:
     current_pope = pope

بعد حلقة for ستحصل على آخر عنصر في متغير current_pope.





indexing