说我有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
可以解决此问题以及其他一些问题。
答案 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)额外的内存。