繁体   English   中英

查找有关python“本地”类型的文档,例如set

[英]Finding documentation on python “native” types, e.g. set

我正在尝试学习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文档中没有看到它,也无法获取inspect模块给我任何东西。 我什至不确定set是一个模块,它似乎是一种类型。 是在模块中定义的还是什么?

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


回应jonrsharpe的评论:

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

我唯一可能做的不同的是将其写为

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

因为在功能上它们没有扮演不同的角色时,我觉得把strings[0]strings[1:]中的strings[1:]区别开来会困扰我。 如果我必须在其中之一上调用set() ,我宁愿在所有它们上调用它,因为union()无论如何都会这样做。 但这只是样式,对不对?

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

Class.method(instance, arg)

等效于:

instance.method(arg)

例如方法 您可以在类上调用方法并显式提供实例,也可以仅在实例上调用它。

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

set.union(aset, anotherset)

是相同的

aset.union(anotherset)

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

set文档中没有直接涉及到这一点,因为对于所有情况都是如此。 Python非常一致。

在需要“啪啪”方面,请注意文档说:

union(other, ...)

而不是

union(others)

也就是说,每个可迭代对象都是一个单独的参数,因此您需要解压缩可迭代对象列表。


因此,您的功能可能是:

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))))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM