كيف أقوم بدمج مصفوفة ثنائية الأبعاد في بايثون في سلسلة واحدة باستخدام قائمة الفهم؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

يبدو أن فهم القائمة بالنسبة لي يشبه كتلة الجرانيت غير الشفافة التي تمثلها التعبيرات العادية بالنسبة لي.أحتاج إلى مؤشرات.

لنفترض أن لدي قائمة ثنائية الأبعاد:

li = [[0,1,2],[3,4,5],[6,7,8]]

أود دمج هذا إما في قائمة واحدة طويلة

li2 = [0,1,2,3,4,5,6,7,8]

أو في سلسلة ذات فواصل:

s = "0,1,2,3,4,5,6,7,8"

حقا، أود أن أعرف كيفية القيام بالأمرين معا.

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

المحلول

مثل ذلك:

[ item for innerlist in outerlist for item in innerlist ]

تحويل ذلك مباشرة إلى سلسلة مع فواصل:

','.join(str(item) for innerlist in outerlist for item in innerlist)

نعم، ترتيب "للقائمة الداخلية في القائمة الخارجية" و"للعنصر في القائمة الداخلية" صحيح.على الرغم من أن "نص" الحلقة موجود في بداية القائمة، فإن ترتيب الحلقات المتداخلة (وعبارات "if") لا يزال هو نفسه عندما تكتب الحلقة:

for innerlist in outerlist:
    for item in innerlist:
        ...

نصائح أخرى

جرب ذلك:

li=[[0,1,2],[3,4,5],[6,7,8]]
li2 = [ y for x in li for y in x]

يمكنك قراءتها مثل هذا:
أعطني قائمة كل نعم.
نعم تأتي من XS.
XS تأتي من لي.

لتعيين ذلك في سلسلة:

','.join(map(str,li2))

هناك خياران.أولاً، يمكنك فقط إنشاء قائمة جديدة وإضافة محتويات كل قائمة إليها:

li2 = []
for sublist in li:
    li2.extend(sublist)

وبدلاً من ذلك، يمكنك استخدام itertools الوحدة النمطية chain دالة، والتي تنتج تكرارًا يحتوي على جميع العناصر الموجودة في تكرارات متعددة:

import itertools
li2 = list(itertools.chain(*li))

إذا اتبعت هذا النهج، فيمكنك إنتاج السلسلة دون إنشاء قائمة وسيطة:

s = ",".join(itertools.chain(*li))

المفضل لدي والأقصر هو هذا:

li2 = sum(li, [])

و

s = ','.join(li2)

يحرر:يستخدم sum بدلاً من reduce, ، (شكرًا توماس ووترز!)

لجعلها قائمة مسطحة استخدم إما:

  1. http://code.activestate.com/recipes/121294/
  2. http://code.activestate.com/recipes/363051/

ثم، join لجعلها سلسلة.

بالنسبة للطريقة الثانية، هناك طريقة سلسلة مضمنة للقيام بذلك:

>>> print ','.join(str(x) for x in li2)
"0,1,2,3,4,5,6,7,8"

بالنسبة للخيار الأول، يمكنك استخدام join ضمن قائمة الفهم:

>>> print ",".join([",".join(str(x) for x in li])
"0,1,2,3,4,5,6,7,8"

ولكن من الأسهل استخدام itertools.flatten :

>>> import itertools
>>> print itertools.flatten(li)
[0,1,2,3,4,5,6,7,8]
>>> print ",".join(str(x) for x in itertools.flatten(li))
"0,1,2,3,4,5,6,7,8"

ملحوظة:itertools هي وحدة نمطية تساعدك على التعامل مع المهام الشائعة مع التكرارات مثل القائمة أو الصفوف أو السلسلة...إنه مفيد لأنه لا يخزن نسخة من الهيكل الذي تعمل عليه ولكنه يعالج العناصر واحدًا تلو الآخر.

يحرر :مضحك، وأنا أتعلم الكثير من الطرق للقيام بذلك.ومن قال أن هناك طريقة واحدة جيدة فقط للقيام بذلك؟

هناك طرق عديدة لحل هذه المشكلة.انا يعجبني نومبيأدوات لأنه عادةً ما يتم استيرادها بالفعل في كل ما أقوم به.ومع ذلك، إذا كنت لا تستخدم Numpy لأي شيء آخر، فمن المحتمل أن هذه ليست طريقة جيدة.

import numpy
li = [[0,1,2],[3,4,5],[6,7,8]]
li2=li[0] #first element of array to merge
i=1 
while i<len(li):
    li2=numpy.concatenate((li2,li[i]))
    i+=1
print li2

سيؤدي هذا إلى طباعة [0 1 2 3 4 5 6 7 8] ومن ثم يمكنك تحويل هذا إلى السلسلة الخاصة بك أيضًا.

import itertools
itertools.flatten( li )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top