【问题标题】:Negative sign swapping in a python listpython列表中的负号交换
【发布时间】:2021-04-25 09:50:56
【问题描述】:
x = [[-123 456],[567 -8910],[432 -890], [-567 976]]

我有一个列表列表,我想交换列表中 x 和 y 元素的负号,如果 x 不是负数,则应将其更改为负数,如果 y 为负数,则应将其更改为正数(只需必须更改符号)。

应该是这样的:

x = [[-123 456],[-567 8910],[-432 890], [-567 976]]

我还想提取单独列表中的所有 x 元素(例如:u = [-123,-567,-432,-567])和单独列表中的 y 元素(例如:v = [456、8910、980、976])。请提出可能的解决方案。

我面临的问题是元素之间没有逗号

【问题讨论】:

  • - number 将翻转一个数字的符号。
  • 你能证明自己任何努力解决这个问题吗?
  • 您可以使用嵌套列表推导来做到这一点。
  • 欢迎来到 Stack Overflow! StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请查看How to Ask,并转至tour :) 我希望以上提示能够为您指明正确的方向。
  • 如果内部元素之间没有逗号,则为 语法错误。如果内部列表的元素之间和外部列表的元素之间没有逗号,则无法创建列表列表。是用户提供的文本输入还是什么?

标签: python list numbers negative-number


【解决方案1】:

基本上,您希望所有x 都是负数,所有y 都是正数。 abs 在这里非常有用。无需检查是否为负。

data = [[-123, 456], [567, -8910], [432, -890], [-567, 976]]

output = [[-abs(x), abs(y)] for x, y in data]

要获取列表中的所有 x 和所有 y 是另一个简单的理解,只需排除您不想要的值。

all_x = [x for x, y in data]
all_y = [y for x, y in data]

【讨论】:

  • abs() 总是返回正数。当x-123-abs(x) 将是-123。你没有翻转标志。
  • @barmar 正确。他们不希望它在那种情况下翻转。
  • 我明白了,我不明白 x 和 y 的规则是不同的。以为他们只是想翻转一切。
【解决方案2】:
import numpy as np
data = np.array([[-123, 456],[567, -8910],[432, -890], [-567, 976]])

# Negative-Number
for i in range(data.shape[0]):
  if(data[i][0]>0):
    data[i][0] = data[i][0]*-1
  if(data[i][1]<0):
    data[i][1] = data[i][1]*-1

# Store results
all_x = [x for x, y in data]
all_y = [y for x, y in data]

输出:

print("Output:\n",data)
print("all_x:\n",all_x)
print("all_y:\n",all_y)

Output:
 [[-123  456]
 [-567 8910]
 [-432  890]
 [-567  976]]
all_x:
 [-123, -567, -432, -567]
all_y:
 [456, 8910, 890, 976]

【讨论】:

  • 如果你不使用numpy,为什么还要使用numpy
  • 我猜只是一个坏习惯
【解决方案3】:

如果你能够使用 numpy,那就很简单了:

import numpy as np

x = np.array([[-123, 456],[567, -8910],[432, -890], [-567, 976]])
out = np.abs(x) * [-1, 1]

print(out)

结果:

> [[-123  456]
 [-567 8910]
 [-432  890]
 [-567  976]]

要拆分成单独的数组,只需使用数组切片:

xArr = out[:,0]
yArr = out[:,1]

【讨论】:

  • 最后一个列表的输出不正确。根据 OP,它应该是 [-567, 976]。
  • 我认为这一定是 OP 示例中的错字,因为这似乎不符合他的要求
  • 主要问题是元素之间没有逗号,这就是为什么我每次都会出错,
  • 例子是正确的,我们只需要将负号从第二个元素移到第一个
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多