طريقة بايثونية لتقسيم الأرقام المفصولة بفواصل إلى أزواج

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

  •  22-08-2019
  •  | 
  •  

سؤال

أرغب في تقسيم قيمة مفصولة بفواصل إلى أزواج:

>>> s = '0,1,2,3,4,5,6,7,8,9'
>>> pairs = # something pythonic
>>> pairs
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]

ماذا سوف # شيء بيثوني يبدو مثل؟

كيف يمكنك اكتشاف والتعامل مع سلسلة تحتوي على مجموعة فردية من الأرقام؟

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

المحلول

وشيء من هذا القبيل:

zip(t[::2], t[1::2])

والمثال الكامل:

>>> s = ','.join(str(i) for i in range(10))
>>> s
'0,1,2,3,4,5,6,7,8,9'
>>> t = [int(i) for i in s.split(',')]
>>> t
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> p = zip(t[::2], t[1::2])
>>> p
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
>>>

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

نصائح أخرى

وثمة خيار أكثر عمومية، الذي يعمل أيضا على التكرارات ويسمح للجمع بين أي عدد من العناصر:

 def n_wise(seq, n):
     return zip(*([iter(seq)]*n))

واستبدال الرمز البريدي مع itertools.izip إذا كنت ترغب في الحصول على مكرر كسول بدلا من القائمة.

وماذا عن هذا:

>>> x = '0,1,2,3,4,5,6,7,8,9'.split(',')
>>> def chunker(seq, size):
...     return (tuple(seq[pos:pos + size]) for pos in xrange(0, len(seq), size))
...
>>> list(chunker(x, 2))
[('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9')]

سيؤدي هذا أيضًا إلى التعامل بشكل جيد مع الكميات غير المتساوية:

>>> x = '0,1,2,3,4,5,6,7,8,9,10'.split(',')
>>> list(chunker(x, 2))
[('0', '1'), ('2', '3'), ('4', '5'), ('6', '7'), ('8', '9'), ('10',)]

ملاحظة.لقد قمت بتخزين هذا الرمز وأدركت للتو من أين حصلت عليه.هناك سؤالان متشابهان جدًا في Stackoverflow حول هذا:

هناك أيضًا هذه الجوهرة من وصفات قسم من itertools:

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

وحل مثل الكثير من FogleBirds، ولكن باستخدام مكرر (أ التعبير مولد) بدلا من قائمة الفهم.

s = '0,1,2,3,4,5,6,7,8,9'
# generator expression creating an iterator yielding numbers
iterator = (int(i) for i in s.split(','))

# use zip to create pairs
# (will ignore last item if odd number of items)
# Note that zip() returns a list in Python 2.x, 
# in Python 3 it returns an iterator
pairs = zip(iterator, iterator)

وربما يعتبر كلا comprehensions قائمة والعبارات مولد تماما "pythonic".

وهذا سيتم تجاهل الرقم الأخير في قائمة غريبة:

n = [int(x) for x in s.split(',')]
print zip(n[::2], n[1::2])

وهذه لوحة قائمة قصيرة من قبل 0 في قائمة غريبة:

import itertools
n = [int(x) for x in s.split(',')]
print list(itertools.izip_longest(n[::2], n[1::2], fillvalue=0))

izip_longest متاح في بايثون 2.6.

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