我正在尝试学习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实现相同的功能,我可以想到迭代器,但是有一种更有效的方法,一些非常明显的东西让我眼前一亮?
答案 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))