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,]
Я новичок... может кто-то может помочь?
Почему бы не использовать str(dict)
?
for k, v in network.iteritems():
output.write(str({k: v})[1:-1] + '\n')
"\b"
просто вставляет символ ASCII backspace; он не удаляет только что написанный символ из выходного файла. Вот почему ваш код не ведет себя так, как вы ожидаете.
Теперь, чтобы исправить это, вы могли бы заменить
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
. Кроме того, если значения в словаре являются списками целых чисел или somesuch, тогда весь танец ", ".join(map(repr, v))
может быть ненужным.
Используйте str.join
для генерации значений с разделителями-запятыми, чтобы избежать необходимости в backspace:
str.join(iterable)
Возвращает строку, которая является конкатенацией строк в итерабельной итерабельной. Разделителем между элементами является строка, предоставляющая этот метод.
Более простой подход - это, например, список понятий, итерация по элементам словаря:
>>> [output.write("%s:%s\n" % item) for item in network.items()]
Попробуйте следующее:
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
для создания списка, разделенного запятыми. Это "питонический" способ объединения списков (или, точнее, итераций) строк.
Вы не можете удалять символы, записанные в файле в целом.
Однако, немного изменив код, вы можете получить следующее:
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()
Независимо от того, действительно ли символ backspace "backspaces" зависит от используемой оболочки.
Намного проще и проще (и правильно) просто выводить данные самостоятельно, как вы хотите отформатировать.
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()