查找有关python“native”类型的文档,例如:组

时间:2014-08-05 19:30:33

标签: python set splat

我正在努力学习Python,虽然我偶然发现了当前问题的答案,但我想知道将来如何更好地找到答案。

我的目标是将字符串列表作为输入,并返回一个字符串,其字符是字符串中字符的并集,例如。

unionStrings( ("ab", "bc"))

会返回“abc”。

我实现了这样:

def unionStrings( strings ):
     # Input: A list of strings
     # Output: A string that is the (set) union of input strings
    all = set()
    for s in strings:
         all = all.union(set(s))

    return "".join(sorted(list(all)))

我觉得for循环是不必要的,并寻找更整洁,更pythonic(?),改进。

第一个问题:我偶然使用了类方法set.union(),而不是set1.union(set2)。我应该能够在标准的Python文档中找到它吗?我无法在那里找到它。

所以我尝试使用这样的set.union():

>>> set.union( [set(x) for x in ("ab","bc")] )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor 'union' requires a 'set' object but received a 'list'

再次,我偶然发现,最后发现我应该这样称呼它:

>>> set.union( *[set(x) for x in ("ab","bc")] )
set(['a', 'c', 'b'])

第二个问题:我认为这意味着set.union被(有效)声明为

set.union( *sets)

而不是

set.union( setsList ) 

这是对的吗? (我还在学习如何使用splat'*'。)

第三个问题:我在哪里可以找到有关set.union()签名的文档?我没有在set / freezeset doc中看到它,我无法让inspect模块给我任何东西。我甚至不确定set是一个模块,它似乎是一种类型。它是在模块中定义的,还是什么?

感谢您阅读我复杂的问题。它更“我如何浏览Python文档?”而不是“如何在Python代码中执行此操作?”。


回应jonrsharpe的评论:

Ohhhhh!我已经习惯了C ++,你可以在其中定义单独的静态和实例方法。现在你解释它我真的可以看到发生了什么。

我唯一可能做的就是把它写成

t = set.union( *[set(x) for x strings] )
return "".join(sorted(t))

因为在功能上他们没有扮演不同的角色时,strings[0]strings[1:]中的字符串不同,这使我感到不安。如果我必须在其中一个上调用set(),我宁愿在所有这些上调用它,因为union()无论如何都会这样做。但这只是风格,对吧?

1 个答案:

答案 0 :(得分:2)

这里有几个问题。首先,你应该知道:

Class.method(instance, arg)

相当于:

instance.method(arg)

用于实例方法。您可以在类上调用该方法并显式提供该实例,或者只在实例上调用它。

由于历史原因,许多标准库和内置类型都不遵循UppercaseWords类名称约定,但它们是类。因此

set.union(aset, anotherset)

相同
aset.union(anotherset)

set方法特别棘手,因为它们经常使用的方式。 set.method(arg1, arg2, ...)要求arg1 已经是set ,该方法的实例,但所有其他参数都将被转换(从2.6开始)。

这不是set文档中直接涵盖的内容,因为它适用于所有内容; Python非常一致。

在需要&#34; splat&#34;方面,请注意文档说:

union(other, ...)

而不是

union(others)

即。每个iterable都是一个单独的参数,因此您需要解压缩迭代列表。


您的功能可能是:

def union_strings(strings):
    if not strings:
        return ""
    return "".join(sorted(set(strings[0]).union(*strings[1:])))

或者,避免strings[0]的特殊情况:

def union_strings(strings): 
    if not strings:
        return ""
    return "".join(sorted(set.union(*map(set, strings))))