递归方法到zip列表?

时间:2019-07-14 14:34:56

标签: python

我有一个嵌套的列表列表,如下所示,

list1 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

但是,我想找到一种将每个列表的第一个索引与另一个列表的第一个索引连接起来的方法。

list1 = [[1,4,7,10],[2,5,8,11],[3,6,9,12]]

我尝试使用以下代码进行列表理解

list1 = [[list1[j][i] for j in range(len(list1)) ] for i in range(len(list1[0])) ]

# gives me
# list1 = [[1,4,7,10],[2,5,8,11],[3,6,9,12]]

但是,我希望其他方法能够达到相同的结果,希望它更简单,更优雅。

谢谢。

4 个答案:

答案 0 :(得分:4)

zip是一种内置方法,不需要外部软件包:

>>> list1 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
>>> print([list(x) for x in zip(*list1)])
[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]

请注意*list1!这是必需的,因为list1是一个嵌套列表,因此*将该列表的元素解压缩到zip方法中以压缩在一起。然后,由于zip返回一个元组列表,我们只需将它们转换为列表(根据您的请求)

答案 1 :(得分:2)

可能的递归解决方案可以利用生成器:

def r_zip(d):
   yield [i[0] for i in d]
   if d[0][1:]:
     yield from r_zip([i[1:] for i in d])

print(list(r_zip(list1)))

输出:

[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]

答案 2 :(得分:1)

<android.support.design.widget.TextInputLayout
            android:id="@+id/til_reset_email"
            android:layout_width="match_parent"
            app:errorTextAppearance="@style/TextInputErrorStyle"
            android:theme="@style/TextInputLayoutTheme"
            app:error="@{viewModel.userNameErrorVisibility}"
            app:errorMsg="@{@string/error_message}"
            android:layout_height="wrap_content">

            <android.support.v7.widget.AppCompatEditText
                android:id="@+id/et_user_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/reset_password_hint"
                android:imeOptions="actionDone"
                android:inputType="textPersonName"
                android:onTextChanged="@{viewModel.onUserNameTextChanged}"
                android:text="@={viewModel.userName}"
                android:textColor="@color/colorWhite"
                android:textColorHint="@color/colorWhite"
                android:textSize="16sp"
                app:backgroundTint="@color/colorWhite" />
        </android.support.design.widget.TextInputLayout>

答案 3 :(得分:0)

或尝试使用:

>>> list1 = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]
>>> list(map(list, zip(*list1)))
[[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]
>>>