【问题标题】:sliced list encapsulated in "tuple", how to get list elems out and print?封装在“元组”中的切片列表,如何获取列表元素并打印?
【发布时间】:2018-04-18 04:24:25
【问题描述】:

例如,我有一个函数 print_members() 应该打印传入的 2 个参数、给定组的名称和组成员的名称:

def print_members(group_name, *member_names):
    print("Members of", group_name)

    for i in range(len(member_names)):
        print(member_names[i])

在 main() 中,我创建了一个需要使用函数打印的列表,其中列表的第一个元素是 group_name,其余的是组成员的名称。为此,我在 main() 中运行以下命令

def main():
    group_mates = ["Book Club", "Allen", "Karla", "Matt", "Nadia"]
    print_members(group_mates[0], group_mates[1:])

但是,当它运行时(afaik)将第二个参数作为一个元素的元组传递,即切片列表,因此当它通过 for 循环时,它只会看到一个元素,即封​​装的切片列表。像这样:

(['Allen', 'Karla', 'Matt', 'Nadia'])

所以它打印出来:

Members of Book Club
['Allen', 'Karla', 'Matt', 'Nadia']

即使它应该是

Members of Book Club
Allen
Karla
Matt
Nadia

是否有另一种方法可以在 main() 中调用函数 print_members(),这样它就不会将切片列表封装在一个元组中?还是有更好的方法来编写 print_members() ?该函数还需要能够在第一个参数之后接受任意数量的组成员名称,因此是星号,并以与我希望它打印单个列表的元组相同的方式打印它,所以我不能在我将其作为参数后将其展平。这样做会(再次afaik)展平已经是一维列表的列表,使每个 character 在列表中成为自己的元素。我需要每个 name 作为它自己的元素。任何和所有的帮助将不胜感激。

【问题讨论】:

  • 为什么你的函数print_members 在参数* 中有*member_names?这表示 *args:digitalocean.com/community/tutorials/…。如果您删除*,您的函数会执行您希望它执行的操作。列表已经是可变的,这意味着它的长度和元素数量已经可以改变,* 意味着列表的数量可以改变。
  • 另外,我建议找到除列表之外的另一种对象类型来解决此问题。我会考虑使用 python 字典。
  • @DavidJohnColemanII 该函数需要能够将名称作为逗号分隔的参数,而不仅仅是作为具有组名和成员名的列表
  • 例如像print_members("Book Club", "Allen", "Karla", "Matt", "Nadia")一样,这就是为什么参数中有一个星号
  • 查看我在@ReblochonMasque 的回答中关于如何处理可变参数的评论。

标签: python list parameters tuples slice


【解决方案1】:

你为什么要解压print_members中的参数member_names

def print_members(group_name, member_names):  # <-- here
    print("Members of", group_name)

    for i in range(len(member_names)):
        print(member_names[i])

def main():
    group_mates = ["Book Club", "Allen", "Karla", "Matt", "Nadia"]
    print_members(group_mates[0], group_mates[1:])

main()

输出:

Members of Book Club
Allen
Karla
Matt
Nadia

替代数据结构:

正如@DavidJohnColemanII 所建议的,您可以使用字典将俱乐部与其成员集合映射:

group_mates = {"Book Club": ["Allen", "Karla", "Matt", "Nadia"]}

并遍历要打印的键和值:

for group, members in group_mates.items():
    print(f"Members of {group}:", end='\n')
    for member in members:
        print(member)

【讨论】:

  • 不错的解决方案。除了列表之外,我会添加一个使用不同对象类型的建议。我认为哈希表/dict 会更好地解决 OP 似乎试图解决的问题。
  • 好点,我添加到答案中,感谢您提出的改进建议。
  • @ReblochonMasque 道歉,我没有说清楚。该函数也应该能够将名称作为逗号分隔的参数,而不仅仅是作为具有组名和成员名的列表。所以它应该能够接收print_members("Book Club", "Allen", "Karla", "Matt", "Nadia") 并打印出来。我宁愿使用列表,因为这是我正在尝试学习的内容
  • 如果你想让你的函数接受这样的参数:print_members("Book Club", "Allen", "Karla", "Matt", "Nadia"),那么这是学习*args and **kwargs如何工作的问题。你可以在这里阅读:digitalocean.com/community/tutorials/…。你的函数原型是:def print_members(*args):group_name = args[0], member_names = args[1:] list()把它变成一个列表
  • 如果您想添加选项以获取可能是列表与各种字符串的输入参数,您需要添加检查 args 长度的逻辑:len(args) 和 args 类型: type(args[0]).__name__ 按此顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2023-03-09
相关资源
最近更新 更多