1
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,]

我是新手....有人可以帮忙吗?

4

6 回答 6

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)可以简化为 just k。此外,如果字典中的值是整数列表或类似的列表,那么整个", ".join(map(repr, v))舞蹈可能是不必要的。

于 2011-05-04T17:04:03.940 回答
4

用于str.join生成逗号分隔值,以避免需要退格:

str.join(iterable)

返回一个字符串,它是可迭代迭代中字符串的串联。元素之间的分隔符是提供此方法的字符串。

例如,一个更简单的方法是迭代字典项的列表推导:

>>> [output.write("%s:%s\n" % item) for item in network.items()]
于 2011-05-04T16:59:48.823 回答
1

为什么不使用str(dict)

for k, v in network.iteritems():
    output.write(str({k: v})[1:-1] + '\n')
于 2011-05-04T17:07:18.987 回答
0

通常,您不能删除写入文件中的字符。

但是,通过对代码进行一些重新设计,您可以获得以下信息:

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)+":[")
    first=false
    for n in network[ii1]:
        if first: 
             first=false
        else:
             output.write(',')
        output.write('%s'%(repr(n)))
    output.write('\b'+']\n')
output.close()
于 2011-05-04T17:01:08.703 回答
0

试试这个:

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'
with open(str1, 'w') as output:
    for ii1 in network.keys():
        output.write(repr(ii1)+":[")
        output.write(','.join(repr(n) for n in network[ii1]))
        output.write(']\n')

输出network.csv

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]

几点:

  • 我正在使用with ... as ...:. 这保证了文件将被正确关闭。

  • ','.join用来创建逗号分隔的列表。这是合并字符串列表(或更准确地说,是可迭代对象)的“pythonic”方式。

于 2011-05-04T17:05:23.090 回答
0

退格字符是否实际上是“退格”可能取决于您使用的外壳。

按照您想要的格式自己输出数据要简单得多(也更合适)。

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]}
output = open('network.csv','w')
for key,values in network.items():
    str_values = [str(x) for x in values]
    output.write('%s:[%s]' % (key,','.join(str_values))
output.close()
于 2011-05-04T17:06:11.513 回答