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)に単純化できますk。また、ディクショナリ内の値が整数のリストまたはそのようなものである場合、", ".join(map(repr, v))ダンス全体が不要になる可能性があります。

于 2011-05-04T17:04:03.940 に答える
4

str.joinバックスペースの必要性を避けるために、コンマ区切り値を生成するために使用します。

str.join(iterable)

iterable 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'
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 に答える
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 に答える