退格键在Python中似乎无效

1 投票
6 回答
5764 浏览
提问于 2025-04-16 16:59
network={1:[2,3,4],2:[1,3,4], 3:[1,2], 4:[1,3,5], 5:[6,7,8], 6:[5,8],7:[5,6], 8:[5,6,7]}
str1='network.csv'
output = open(str1,'w')
for ii1 in network.keys():
    output.write(repr(ii1)+":[")
    for n in network[ii1]:
        output.write(' %s,'%(repr(n)))
    output.write('\b'+']\n')
output.close()

我希望得到的是这样的:

1:[ 2, 3, 4]
2:[ 1, 3, 4]
3:[ 1, 2]
4:[ 1, 3, 5]
5:[ 6, 7, 8]
6:[ 5, 8]
7:[ 5, 6]
8:[ 5, 6, 7]

但我得到的是:

1:[ 2, 3, 4,]
2:[ 1, 3, 4,]
3:[ 1, 2,]
4:[ 1, 3, 5,]
5:[ 6, 7, 8,]
6:[ 5, 8,]
7:[ 5, 6,]
8:[ 5, 6, 7,]

我还是个新手……能不能请大家帮帮我?

6 个回答

4

使用 str.join 可以生成以逗号分隔的值,这样就不需要手动删除了:

str.join(iterable)

这个方法会把可迭代对象中的字符串连接成一个新的字符串。元素之间的分隔符就是调用这个方法的字符串。

还有一种更简单的方法,比如使用 列表推导式 来遍历字典中的项:

>>> [output.write("%s:%s\n" % item) for item in network.items()]
5

这里的 "\b" 只是插入了一个 ASCII 的退格符,它并不会把刚写的字符从输出文件中删除。这就是为什么你的代码没有按你预期的那样运行。

现在,要解决这个问题,你可以把

for ii1 in network.keys():
    output.write(repr(ii1)+":[")
    for n in network[ii1]:
        output.write(' %s,'%(repr(n)))
    output.write('\b'+']\n')

替换成

for ii1 in network.keys():
    output.write(repr(ii1)+":[ ")
    output.write(", ".join(map(repr, network[ii1])))
    output.write(']\n')

或者,为了进一步改进,可以用

for k, v in network.items():
    print >>output, "%s:[ %s]" % (repr(k), ", ".join(map(repr, v)))

最后,如果键是简单的整数,就像你的例子所示,那么 repr(k) 可以简化为直接使用 k。另外,如果字典中的值是整数列表或类似的东西,那么整个 ", ".join(map(repr, v)) 的操作可能是多余的。

1

为什么不使用 str(dict) 呢?

for k, v in network.iteritems():
    output.write(str({k: v})[1:-1] + '\n')

撰写回答