Python:将字符串的不同部分分离为数组

时间:2015-05-25 00:37:26

标签: python list typeerror

我试图将字符串中的值(在逗号之间)分隔为列表。这就是我到目前为止所做的:

x = ["1,2,3,4,5,", "6,7,8,9,10,"]
x_new = []

for j_1 in range(len(x)):

    y = 0

    for j_2 in range(0, len(x[j_1])):

        if x[j_1][j_2] == ",":
            x_new.append(j_1, (x[j_1][y: j_2]))

            y = j_2 + 1
print("x_new[0] = ", x[0])
print("x_new[1] = ", x[1])

我得到的只是错误信息:

Traceback (most recent call last):
  File "test.py", line 12, in <module>
    x_new.append(j_1, (x[j_1][y: j_2]))
TypeError: append() takes exactly one argument (2 given)

我想要输出代码:

  • x [0] = [&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;,&#34; 4&#34;,&#34; 5& #34;]
  • x [1] = [&#34; 6&#34;,&#34; 7&#34;,&#34; 8&#34;,&#34; 9&#34;,&#34; 10& #34;]

x将始终分为5个字符串。

提前谢谢!

4 个答案:

答案 0 :(得分:2)

让我们来看看您的代码有什么问题。

首先,变量名称使得它很难遵循。为什么你有j_1j_2而不仅仅是ij?就此而言,为什么你总是j_1 而不是直接迭代x

但无论如何,这是你的主要问题:

x_new.append(j_1, (x[j_1][y: j_2]))

这个电话没有任何意义。 append方法只接受一个参数,一个新元素追加到序列的末尾。你传递了两个论点。此外,您将它附加到x_new,它应该是两个列表的列表,而不是相应的子列表。我你想要的是:

x_new[j_1].append(x[j_1][y: j_2])

但是,在你能够做到这一点之前,你还需要实际创建要追加的每个子列表。

然后,最后,Python无法猜出你想要打印出来的东西;如果你要求它打印字符串x_new[0]而不是x[0],或打印出x[0]的内容而不是x_new[0]的内容,那就是你要去的得到。

所以:

x = ["1,2,3,4,5,", "6,7,8,9,10,"]
x_new = []

for j_1 in range(len(x)):
    x_new.append([])
    y = 0    
    for j_2 in range(0, len(x[j_1])):
        if x[j_1][j_2] == ",":
            x_new[j_1].append(x[j_1][y: j_2])

            y = j_2 + 1

print("x[0] =", x_new[0])
print("x[1] =", x_new[1])

然而,这一点都过于复杂。 Python字符串具有split方法。所以,您可以用以下内容替换整个混乱:

x_new = [s.rstrip(',').split(',') for s in x]
print("x[0] =", x_new[0])
print("x[1] =", x_new[1])

rstrip(',')是删除尾随逗号,因此最后不会得到额外的空字符串。您可以使用s.split(',')[:-1]或其他各种方法来获得相同的效果。

答案 1 :(得分:1)

嵌套的条件列表推导可以达到您想要的结果:

x_new = [[i for i in s.split(",") if i] for s in x]
>>> x_new
[['1', '2', '3', '4', '5'], ['6', '7', '8', '9', '10']]

答案 2 :(得分:1)

您的代码错误,因为您正在使用“追加”错误。使用split函数有一种更好的方法:

x = ["1,2,3,4,5,", "6,7,8,9,10,"]
x_new = []

for j in range(len(x)):
    x_new.append([y for y in x[j].split(',') if len(y)>0])

print("x_new[0] = ", x_new[0])
print("x_new[1] = ", x_new[1])

推理:对于列表中的每个元素进行拆分并丢弃空元素(假设最后有一个','。似乎给出了你想要的结果。

剩余的“for”可以被另一个列表理解替换:

x = ["1,2,3,4,5,", "6,7,8,9,10,"]
x_new = [[y for y in x[j].split(',') if len(y)>0] for j in range(len(x))]

如果您想保留代码的样式,这是一个固定版本:

x = ["1,2,3,4,5,", "6,7,8,9,10,"]
x_new = []

for j_1 in range(len(x)):
    y = 0
    x_new_aux = []
    for j_2 in range(len(x[j_1])):
        if x[j_1][j_2] == ",":
            x_new_aux.append(x[j_1][y:j_2])
            y = j_2+1
    x_new.append(x_new_aux)

print("x_new[0] = ", x_new[0])
print("x_new[1] = ", x_new[1])

注意我正在使用辅助列表。

答案 3 :(得分:1)

x = ["1,2,3,4,5,", "6,7,8,9,10,"]
new_list = [x[i].split(',')[:-1] for i in range(len(x))]
>>
 new_list = [['1', '2', '3', '4', '5'], ['6', '7', '8', '9', '10']]