【问题标题】:Incorrect format of generator expression? python生成器表达式的格式不正确? Python
【发布时间】:2015-09-25 08:46:03
【问题描述】:

我正在尝试将几个 ifelse 语句更改为生成器表达式,但由于某种原因它给了我一个错误。

所以我的ifelse 声明是这样的..

sequence = 'CTGAGTAGC'
reference = 'ATGACTGCC'

for seq, ref in zip(sequence,reference):
    if seq == ref:
        print seq,'-',ref
    else:
        print seq,' ',ref

我已经在这个生成器表达式中尝试了上面的 if 和 else 语句..

tmp = (seq,'-',ref if seq==ref else seq,' ',ref for seq,ref in zip(sequence,reference))
print tmp

它给了我这样的错误:

tmp = (seq,'-',ref if seq==ref else seq,' ',ref for seq,ref in zip(sequence,reference))
                                                  ^
SyntaxError: invalid syntax

【问题讨论】:

  • 你想要 (seq, delimiter,ref) 的元组还是 seq+delimiter+ref 的字符串?
  • @NightShade,我要seq+delimiter+ref的字符串
  • 嗯,我不明白为什么我的票被否决了...我的问题格式错误还是什么?

标签: python printing generator generator-expression


【解决方案1】:
print seq,'-',ref

在这种类型的语句中,print 正在为您整理字符串。 seq, '-', ref 其他任何地方都是元组,如果你不想要一个元组....

tmp = ( "-".join(i) if i[0] == i[1] else " ".join(i) for i in zip(sequence,reference))

for i in tmp:
    print i

"-".join(i) if i[0] == i[1] else " ".join(i)是一个python三元表达式(形式为A if condition else B

【讨论】:

    【解决方案2】:

    您需要消除表达式中的元组的歧义:

    tmp = ((seq, '-', ref) if seq == ref else (seq, ' ', ref)
           for seq, ref in zip(sequence, reference))
    

    甚至

    tmp = ((seq, '-' if seq == ref else ' ', ref)
           for seq, ref in zip(sequence, reference))
    

    演示:

    >>> sequence = 'CTGAGTAGC'
    >>> reference = 'ATGACTGCC'
    >>> tmp = ((seq, '-' if seq == ref else ' ', ref)
    ...        for seq, ref in zip(sequence, reference))
    >>> for tup in tmp:
    ...     print tup
    ... 
    ('C', ' ', 'A')
    ('T', '-', 'T')
    ('G', '-', 'G')
    ('A', '-', 'A')
    ('G', ' ', 'C')
    ('T', '-', 'T')
    ('A', ' ', 'G')
    ('G', ' ', 'C')
    ('C', '-', 'C')
    

    【讨论】:

    • 嗯,应该是((seq, '-', ref) if seq == ref else (seq, ' ', ref) for...)吧?
    • @DanielRoseman:你去吧,说明为什么这里需要消歧。 :-)
    • @Pieters 上面的 if 和 else 语句实际上打印出字符串,但是您发布的解决方案给了我 at 0x10d5c5dc0> this..
    • @Danny:您要求生成器表达式,这就是生成器表达式在打印时的样子。您需要迭代生成器以访问它产生的结果。
    • @ Pieters 哦,所以我想我必须使用另一个 for 循环......这不会使整个代码变得复杂 O(n^2) 吗?抱歉,我是 python 新手
    猜你喜欢
    • 2017-12-08
    • 1970-01-01
    • 2014-04-02
    • 2021-12-27
    • 2011-08-17
    • 2021-10-17
    • 2021-04-26
    • 2012-08-20
    相关资源
    最近更新 更多