如何按我需要的方式打印graf

2024-10-04 11:33:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我得打印字典(邻接表):

{'ACATG':{'CATGA', 'CATGT'}, 'TGATT':{'GATTA'}, 'GGGAT':{'GGATC', 
'GGATA'}}

这样:

ACATG -> CATGA, CATGT
TGATT -> GATTA
GGGAT -> GGATC, GGATA

并将其存储到.txt文件中

我试着这样打印:

di = {'ACATG':{'CATGA', 'CATGT'}, 'TGATT':{'GATTA'}, 'GGGAT':{'GGATC', 
'GGATA'}}
for v,u in di.items():
  print(v+' -> ', end="")
  li = []
  for g in u:
    li.append(g)
    print(g,end='')
    print(',',end='')
  print('')

但在每一组的末尾都有一个额外的逗号:

ACATG -> CATGA,CATGT,
TGATT -> GATTA,
GGGAT -> GGATC,GGATA,

而且代码太长了,而且不是pythonic。我也想 将打印输出存储到文件中


Tags: 文件inforliendprintdiggata
3条回答

这是一条单行线:

g = {'ACATG':{'CATGA', 'CATGT'}, 'TGATT':{'GATTA'}, 'GGGAT':{'GGATC', 
'GGATA'}}

print(*[f"{k} -> {', '.join(v)}" for k, v in g.items()], sep = "\n")

输出:

ACATG -> CATGT, CATGA
TGATT -> GATTA
GGGAT -> GGATC, GGATA

print中的*解压我们将要创建的列表。引号前的f表示它是一个格式字符串文本k将是字典中的每个键,我们使用', '.join(v)在每个元素之间放置逗号和空格sep="\n"在每个元素之间打印新行

您可以这样做:

for key, value in di.items():
    print(f"{key} -> {', '.join(sorted(value))}")

我在这里使用sorted来强制确定顺序,因为set的(比如{'CATGA', 'CATGT'})不是有序的,所以每次运行脚本时都可以得到一个具有相同数据的新顺序

此外,在python3.6之前,字典(比如di)也是无序的,因此您应该确保您的脚本运行在最新版本的Python上(为了安全起见),或者使用collections.OrderedDict强制字典元素的特定顺序

def write_seq(di, file=None):
  for key, values in di.items():
    value = ', '.join(sorted(values))
    print(f'{key} -> {value}', file=file)

非常类似于@ForceBru,但是在一个函数中,所以您可以根据需要传递文件。将其保留为默认值将写入stdout,或者您可以这样做,例如:

with open('out.di', 'w') as fd:
  write_seq(di, fd)

相关问题 更多 >