【问题标题】:Python 3.x: Use index of second repeated indexPython 3.x:使用第二个重复索引的索引
【发布时间】:2017-06-21 21:44:50
【问题描述】:

那里有很多类似的帖子,但我找不到与我正在处理的问题直接匹配或导致解决方案的内容。

我想使用列表中包含的重复索引的第二个实例作为另一个列表的索引。执行该函数时,我希望在用户代码之后从列表开头到第一个星号到print 的所有数字,在密码之后打印第一个星号和第二个星号之间的所有数字,然后是后面的所有数字直到列表末尾的第二个星号在 Pin 代码之后打印。 digit 的示例数据为 "['1', '2', '3', '4', '5', '*', '6', '*', '7', '8', '9', '10', '1']" 。用户代码、密码和密码的元素数量可以改变,这就是为什么我试图让它在星号周围打印。

换句话说,我希望下面的代码为print,假设这些数字存在,User Code: 12345, Pass Code: 6, Pin Code: 789101,都在一行中。我不希望星号为print

print_string += 'Elapsed Time: ' + str(time) + ', ' + 'User Code: {} '.format(''.join(str(dig) for dig in digit[:digit.index('*')])) + \
                        'Pass Code: {} '.format(''.join(str(dig) for dig in digit[digit.index('*'):digit.index('*')])) + \
                        'Pin Code: {} '.format(''.join(str(dig) for dig in digit[digit.index('*'):]))
print(print_string)

我只是不知道如何让它寻找连续的星号。如果有更简单的方法来执行这个,请告诉我!

谢谢

【问题讨论】:

  • 仅供参考,我是 Python 新手。 @spectras 不完全确定 str.split 在这种情况下如何工作。如果我错了,请纠正我,但 str.split 不是用于操纵字符串的存储方式,在这种情况下,是在列表中吗?如果可以使用,我不知道如何使用它。本质上,我想将第一个星号称为 Code1 的右索引,将第一个星号称为左索引,将第二个星号称为 Code2 的右索引,将第二个星号称为 Code3 的左索引

标签: python list indexing printing


【解决方案1】:

您应该能够结合使用splitenumerate

split 会将值转换为列表,您可以使用 enumerate 在获取值的同时获取当前代码的索引。

code = '1234*5678*9101'
for i,val in enumerate(code.split('*')):
    if i < len(lst)-1:
        val += "*"
    print ("Code {}: {}".format(i, val))

如果你想把它全部放在一行上,你也可以使用 print 的 end 参数,使 `print 看起来像这样:

print ("Code {}: {},".format(i, val), end='')

结果:

Code 1: 1234*
Code 2: 5678*
Code 3: 9101
Code 1: 1234*, Code 2: 5678*, Code 3: 9101,

编辑:更新了新的帖子信息

带有标题的可选打印:

codeIn = ['1', '2', '3', '4', '5', '*', '6', '*', '7', '8', '9', '10', '1']

codeVals = ("".join(codeIn)).split("*")

titles = ["User Code", "Pass Code", "Pin Code"]
for title, val in zip(titles, codeVals):
    print ("{}: {}".format(title, val)) 

输出:

User Code: 12345
Pass Code: 6
Pin Code: 789101

【讨论】:

  • 如果我不希望它打印“code 1”、“code 2”和“code 3”作为输出,我该怎么办?我不希望它按顺序编号“代码 { }:”,而是希望它在一行中打印“用户代码:”“密码:”和“密码:”。 @bloominonion
  • 您可以创建另一个包含要使用的标题的列表。见编辑。
【解决方案2】:

拆分星号(分隔符)以获取各个字符串。 打印时,将其附加到除最后一项之外的所有内容。

in_str = '1234*5678*9101'
sep = '*'
code_list = in_str.split(sep)

for seq, item in enumerate(code_list):
    term = '*' if seq < len(code_list)-1 else ''
    print "Code" + str(seq) + ':', item + term

输出:

Code0: 1234*
Code1: 5678*
Code2: 9101

【讨论】:

  • 问题中的星号很可能不是必需的,而是 OP 如何考虑问题的副作用。 @drauch> 如果提取的代码不包含无关的星号,可以吗?这将使代码更加简单,因为这个答案实际上是在拆分代码后手动重新添加它们。
  • @spectras,星号不是必需的。提取的代码不需要包含星号,只需包含两者之间的值。
  • @Prune 我忘了提到数字的数据输入,或者在你的情况下是 in_str,实际上是一个列表。所以输入看起来像“['1', '2', '3', '4', '5', '*', '6', '*', '7', '8', '9 ', '10', '11']",这导致您提供的代码导致:Attribute Error: 'list' object has no attribute 'split'
  • 您将其显示为字符串,也就是说,数字的示例数据为 '1234*5678*9101'。` 请更正您的帖子。 “修复”此问题的简单方法是将 join 列表转换为单个字符串,然后继续使用我们为您提供的解决方案。
  • @Prune 我已经更新了帖子。希望我想做什么更清楚。
猜你喜欢
  • 1970-01-01
  • 2017-12-20
  • 2018-11-24
  • 2020-09-30
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 2011-01-15
相关资源
最近更新 更多