尝试在Python中交换列表中的项

2024-10-01 04:54:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我的清单如下:

mylist = [['0010', 0.9], ['1111', 2.03], ['1101', 2.04], ['0010', 0.90]]

我想对这些元素的每两个连续对进行操作,主要是二进制部分。所以对于mylist[0][0](0010)和mylist[1][0](1111),我想为每个位生成一个随机数,如果这个数小于0.8,则交换两个连续字符串中的每个对应位。(无重叠)

为了简单起见,假设我一直得到0.4概率,那么我的字符串应该是:

0010 ---> 1111 mylist[0][0]
1111 ---> 0010 mylist[1][0]
Done comparing two strings.
---------------
1101 ---> 0010 mylist[2][0]
0010 ---> 1101 mylist[3][0]
Done comparing two strings.

第二部分(0.9和2.03及类似版本)并不重要,但它只是作为一个结构存在

我的尝试如下:

mylist = [['0010', 0.9], ['1111', 2.03], ['1101', 2.04], ['0010', 0.90]]
numberoftotalstrings = 4
lengthofbits = 4

for i in range(0, numberoftotalstrings, 2):
  currentword = list(mylist[i][0])
  nextword = list(mylist[i+1][0])

  for j in range(0, lengthofbits, 1):
    x = random.uniform(0,1)
    print (x)
    if x <= 0.8:
      tmp = currentword[j]
      currentword[j] = nextword[j]
      nextword[j] = tmp
  tmp1 = "".join(currentword)
  tmp2 = "".join(nextword)

  mylist[i][0] = tmp1
  mylist[i+1][0] = tmp2

但遗憾的是,它似乎没有产生工作结果,因为一些交换操作本应该发生,反之亦然。我不明白缺失的部分是什么


Tags: 字符串inforrangetmplistcomparingtwo
1条回答
网友
1楼 · 发布于 2024-10-01 04:54:21

您的代码似乎产生了预期的结果

测试1:硬编码x=0.4,生成您指定的输出

测试2:代码重写产生相同的输出

重构代码

下面是对产生相同输出的代码的重写

注意:在运行新代码和原始代码之前,使用random.seed(1023)进行测试,以便它们具有相同的随机数序列

def swap(x, y):
  z = [[yi, xi] if random.uniform(0,1) <= 0.8 else [xi, yi] for xi, yi in zip(x, y)]
  a, b = zip(*z)
  return ''.join(a), ''.join(b)

for i in range(0, len(mylist), 2):
  mylist[i][0], mylist[i+1][0] = swap(mylist[i][0], mylist[i+1][0])

相关问题 更多 >