كيفية استخراج عضو من عضو واحد في مجموعة الثعبان؟

StackOverflow https://stackoverflow.com/questions/1619514

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا واجهت مؤخرا سيناريو فيه إذا كان تعيين يتضمن سوى عنصر واحد، أردت أن تفعل شيئا مع ذلك العنصر. للحصول على العنصر، واستقر على هذا النهج:

element = list(myset)[0]

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

هل كانت مفيدة؟

المحلول

والصفوف (tuple) تفريغ الأشغال.

(element,) = myset

و(بالمناسبة، استكشفت بيثون ديف ولكن رفض إضافة myset.get() للعودة عنصر التعسفي من مجموعة. <وأ href = "http://mail.python.org/pipermail/python-dev/2009 -October / 093227.html "يختلط =" noreferrer "> مناقشة هنا ، ويجيب غيدو فان روسوم <لأ href =" http://mail.python.org/pipermail/python-dev/2009-October/093367 هتمل "يختلط =" noreferrer "> 1 و 2 ).

وقناعتي الشخصية المفضلة للحصول على عنصر التعسفي هو (عندما يكون لديك عدد غير معروف، ولكنه يعمل أيضا إذا كان لديك واحد فقط):

element = next(iter(myset)) ¹

1 : في بيثون 2.5 ومن قبل، لديك لاستخدام iter(myset).next()

نصائح أخرى

وبين جعل الصفوف (tuple)، وجعل مكرر، انها تقريبا ويغسل، ولكن انتصارات التكرار من الأنف ...:

$ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]'
1000000 loops, best of 3: 0.465 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]'
1000000 loops, best of 3: 0.465 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))'
1000000 loops, best of 3: 0.456 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))'
1000000 loops, best of 3: 0.456 usec per loop

ولا يدري لماذا كل الأجوبة يستخدمون كبار السن في بناء الجملة iter(x).next() بدلا من الجديد في next(iter(x)) واحد، والذي يبدو من الأفضل بالنسبة لي (وأيضا يعمل في بيثون 3.1).

ولكن، تفريغ انتصارات اليدين باستمرار على كل من:

$ python2.6 -mtimeit -s'x=set([1])' 'a,=x'
10000000 loops, best of 3: 0.174 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a,=x'
10000000 loops, best of 3: 0.174 usec per loop

وهذا بالطبع هو لمجموعات البند واحد (حيث الشكل الأخير، كما ذكر آخرون، في الاستفادة من الفشل بسرعة إذا كانت مجموعة لكم "عرف" كان عنصر واحد فقط كان في الواقع عدة). لمجموعات مع N التعسفية> 1 البنود، والصفوف (tuple) يبطئ، وايتر لا:

$ python2.6 -mtimeit -s'x=set(range(99))' 'a=next(iter(x))'
1000000 loops, best of 3: 0.417 usec per loop
$ python2.6 -mtimeit -s'x=set(range(99))' 'a=tuple(x)[0]'
100000 loops, best of 3: 3.12 usec per loop

وهكذا، تفريغ لحالة المفرد، وnext(iter(x)) للحالة العامة، ويبدو أفضل.

كايزر .se في الإجابة كبيرة. ولكن إذا لديك مجموعة <م> قد يحتوي على أكثر من عنصر واحد، وتريد عنصر ليست بهذه التعسفي، قد ترغب في استخدام <لأ href = "http://docs.python.org/library /functions.html#min "يختلط =" نوفولو noreferrer "> min أو max . منها مثلا:

element = min(myset)

وأو:

element = max(myset)

و(لا تستخدم sorted ، لأن له الحمل غير الضرورية ل هذا الاستخدام.)

وأقترح:

element = myset.pop()

ويمكنك استخدام element = tuple(myset)[0] الذي هو جزء أكثر كفاءة، أو يمكنك أن تفعل شيئا مثل

element = iter(myset).next()

وأعتقد بناء مكرر هو أكثر كفاءة من بناء الصفوف (tuple) / القائمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top