Python中是否有任何简单的方法可以将数组中的相邻元素配对?

时间:2019-04-03 17:48:26

标签: python arrays

说我有A = [1, 2, 3, 4]
我想拥有B = [(1,2), (2,3), (3,4)]
因此我可以检查B是否包含(u,v)

已经尝试从每个0的{​​{1}}到len(A)-1进行迭代,但这似乎效率很低。

(A[i],A[i]+1)

我认为,拥有以上A = [1, 2, 3, 4] for i in range(len(A)-1): if A[i] == u and A[i+1] == v: #assume true #assume false 可以解决此问题以及其他一些问题。

4 个答案:

答案 0 :(得分:2)

尝试一下:

B = [(i,j) for i,j in zip(A, A[1:])]

输出

[(1, 2), (2, 3), (3, 4)]

答案 1 :(得分:2)

您还可以使用列表理解:

B=[(A[i],A[i+1]) for i in range(len(A)-1)]

答案 2 :(得分:1)

这将创建您要查找的B

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        List<Cuadro> cuadros = new List<Cuadro>();
        for(int i = 0; i < 10; i++)
        {
            Cuadro cuadro = new Cuadro();
            cuadro.Nombre = $"Cuadro {i}";
            cuadro.Circuitos = new List<Circuito>();

            for(int j = 0; j < 5; j++)
            {
                Circuito circuito = new Circuito();
                circuito.NombreCircuito = $"Circuito {i}.{j}";
                circuito.Caminos = new List<Camino>();

                for(int k = 0; k < 3; k++)
                {
                    Camino camino = new Camino();
                    camino.Ruta = $"Camino {i}.{j}.{k}";
                    circuito.Caminos.Add(camino);
                }
                cuadro.Circuitos.Add(circuito);
            }
            cuadros.Add(cuadro);
        }

        foreach (Cuadro cuadro in cuadros)
        {
            TreeViewItem cuadroItem = new TreeViewItem();
            cuadroItem.Header = cuadro.Nombre;

            foreach (Circuito circuito in cuadro.Circuitos)
            {
                TreeViewItem circuitoItem = new TreeViewItem();
                circuitoItem.Header = circuito.NombreCircuito;

                foreach (Camino camino in circuito.Caminos)
                {
                    TreeViewItem caminoItem = new TreeViewItem();
                    caminoItem.Header = camino.Ruta;
                    circuitoItem.Items.Add(caminoItem);
                }
                cuadroItem.Items.Add(circuitoItem);
            }
            Arbol.Items.Add(cuadroItem);
        }

    }

答案 3 :(得分:1)

zip(A, A[1:])很不错,但缺点是必须先虚拟复制A。可以使用一对单独的迭代器。

from itertools import tee

a1, a2 = tee(A)
next(a2)
B = list(zip(a1, a2))

您可以将对next的调用替换为可以内联的对islice的调用。

from itertools import tee, slice

a1, a2 = tee(A)
B = list(zip(a1, islice(a2, 1))

这些方法都比压缩两个具体列表要慢一些(尽管仍然是线性的),但是使用O(1)而不是O(n)额外的内存。