【问题标题】:Function that takes a list of multiple strings and tuples接受多个字符串和元组列表的函数
【发布时间】:2012-12-01 23:36:25
【问题描述】:

所以,我想创建一个函数,它接受多个字符串和元组的列表,它的作用是,如果它是一个字符串,它只是打印字符串,但如果它是一个元组,则元组接受一个整数和一个字符串,然后将它们相乘。

例子:

print(something(["1stString", "2ndString", (3, "Pie"), (4, "Soda")]))

然后打印出来:

1stString
2ndString
Pie
Pie
Pie
Soda
Soda
Soda
Soda

我的悲惨尝试:

def something(s):
    for x in s:
        if isinstance(s, str):
            print(s)
        if isinstance(s, tuple):
            x = tuple[0] * tuple[1]
        print(x)
    exit()

这适用于字符串,但不适用于元组。

打印出来:

1stString
2ndString
(3, 'Pie')
(4, 'Soda')

我做错了什么?

还有一件事。 如果我希望它以列表的形式打印出来怎么样?

像这样:

['1stString', '2ndString', 'Pie', 'Pie', 'Pie', 'Soda', 'Soda', 'Soda', 'Soda']

【问题讨论】:

    标签: python


    【解决方案1】:

    正如 NPE 所说,您检查的是 s 而不是 x。 s 是整个元素列表,而 x 是 s 的当前元素的占位符。

    def something(s):
        for x in s:
            if isinstance(x, str):
                print(x)
            if isinstance(x, tuple):
                for i in range(x[0]):
                    print x[1]
    

    【讨论】:

    • 啊,这解释了很多,现在可以了,非常感谢。我对这种语言还是新手,我还在弄清楚它是如何工作的。
    • 在第二个 if 中,“elif”会稍微快一些。
    • 会更好用:isinstance(obj, basestring) 这样你就可以同时检测到 str/unicode
    【解决方案2】:

    一个问题是您在isinstance 中检查的是s 而不是x

    isinstance(s, ...
    

    我还应该指出,这种编程风格非常不符合 Python 风格。也许如果您解释了为什么要这样做,我们也许可以改进这种方法。

    【讨论】:

    • 告诉老师,网上随便一个人说他们在教你坏习惯:)
    【解决方案3】:

    Python 3.2:

        def something(s):
                for i in s:
                   if isinstance(i,str):
                        print(i)
                else:
                    print(i[0]*i[1])
    

    它会打印出来

        1stString
        2ndString
        PiePiePie
        SodaSodaSodaSoda
    

    【讨论】:

    • 不,它不会,它只会抱怨非常奇怪的缩进。
    【解决方案4】:

    我会使用生成器函数:

    def yielder(sequ):
        for E in sequ:
            if isinstance(E,str):
                yield E
            else:
                ss = E[1]
                for i in xrange(E[0]):
                    yield ss
    
    li = ["1stString", "2ndString", (3, "Pie"), (4, "Soda")]
    
    print li
    print '----------------------------'
    print list(yielder(li))
    print '----------------------------'
    print '\n'.join(yielder(li))
    

    结果

    ['1stString', '2ndString', (3, 'Pie'), (4, 'Soda')]
    ----------------------------
    ['1stString', '2ndString', 'Pie', 'Pie', 'Pie', 'Soda', 'Soda', 'Soda', 'Soda']
    ----------------------------
    1stString
    2ndString
    Pie
    Pie
    Pie
    Soda
    Soda
    Soda
    Soda
    

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多