在python中嵌套for循环

时间:2012-03-17 06:54:44

标签: python

我正在尝试学习python脚本。作为一些开始用c / c ++或java编码的人,我发现很难找到在python中编写循环的方法,特别是 for 循环条件

我有一个字符串列表A, 我需要一次对这些字符串做一个特定的操作,比如字符串的xor 另外xor(a,b)= xor(b,a),因此我需要在循环时删除冗余对

在传统的lang中我会做类似

的事情
for(i=0;i<len;i++){
    for(j=i+1;j<len;j++){
        res[count]=xor(a[i],a[j])
        count++;
    }
}

那么我如何用Python实现相同的功能,我可以想到迭代器,但是有一种更有效的方法,一些非常明显的东西让我眼前一亮?

6 个答案:

答案 0 :(得分:3)

Python附带batteries included,也就是说,大多数这样的东西都已经为你编写了。如果你想要字符串组合,那就有dedicated function

import itertools

result = []
for pair in itertools.combinations(a, 2):
    result.append(xor(pair[0], pair[1]))

或简单地说:

 result = [xor(*p) for p in itertools.combinations(a, 2)]

答案 1 :(得分:1)

这是另一种翻译:

res = []
for i in range( len( a ) ):
    for j in range( i + 1 ):
        res.append( a[i] ^ a[j] )

甚至是这一个班轮

res = [ a[i] ^ a[j] for i in range( len( a ) ) for j in range( i ) ]

答案 2 :(得分:1)

正如你所看到的 - 有很多方法可以做到 - 使用itertools模块中的函数或者重写然后作为点亮的理解。然而,这些虽然很好,但是减少了对可靠性的可读性,并且因为你现在从Python开始,所以重要的是学会用Python的方式思考“for”循环。

循环的Python方法是:你不迭代索引 - 你有序列,你想对序列上的每个元素执行动作 - 在C(及其派生词)中,通过计算间接地做到这一点字符串长度,从0到字符串lenght迭代数字,将这些数字作为字符串上的索引。在Python中,字符串是一个序列 - 您只需将其用作要进行交互的元素。

除了for循环之外,在Python中,字符串项是len(1)的子字符串,而不是0-255范围内的数字,所以你必须显式地将它们转换为整数,执行xor操作,然后返回 - 这可能是写成一行lambda函数,如:

xor = lambda c1, c2: chr(ord(c1) ^ ord(c2))

或者,您可以使用模仿strign的“bytearray”对象,但在某种意义上它们的行为有点像c strigns它们是可变的,并且它的元素被视为0-255范围内的数字。

至于你的代码:

res = ""
for position, char1 in enumerate(a):
    for char2 in a[position + 1:]:
        res += xor(char1, char2)

对于这样的情况,“enumerate”调用给出一个我们正在与元素本身进行交互的元素的位置。

答案 3 :(得分:1)

这很容易

嵌套循环意味着有多个循环。永远记住,外循环控制内循环的重复。

for letter in [ 'a', 'b'] :
 for num in [1,2,3]:
       print(letter, num)

输出将类似于- a1,a2,a3, b1,b2,b3

您可以看到外循环的每个元素都与内循环的每个元素接合。那就是嵌套循环的作用。

答案 4 :(得分:0)

这个嵌套的Python循环可以解决你的问题。

for i in range(len(a)):
    for j in range(i+1,len(a)):
        #do stuff

答案 5 :(得分:0)

在python中,你经常不需要这样的循环,因为Python已经将循环隐含为序列运算符的一部分,例如切片和列表推导。此外,您不应该在迭代列表时改变列表,因此您只需创建一个新列表。

def xor(s1, s2):
    return "".join([chr(ord(a)^ord(b)) for a,b in zip(s1, s2)])

a = ["ab", "ba", "ab", "ba", "ab", "ba", "ab", "ba", "ab", "ba", "ab", "ba"]

res = [xor(a,b) for a,b in zip(a[::2], a[1::2])]
print(repr(res))