Python 3.x:使用第二个重复索引的索引

问题描述:

这里有很多类似的帖子,但我找不到与我正在处理的问题直接匹配或导致解决方案的内容。Python 3.x:使用第二个重复索引的索引

我想使用包含在列表中的重复索引的第二个实例作为另一个列表的索引。执行该功能时,我需要在用户代码之后从列表开头到第一个星号的所有数字为print,第一个星号和第二个星号之间的所有数字在通行码后打印,然后是第二个后面的所有数字星号直到列表结束后才能打印PIN码。数字的示例数据将是"['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) 

我只是无法弄清楚如何使它看起来顺序星号。如果有更简单的方法来执行此操作,请让我知道!

感谢

+1

['str.split'](https://docs.python.org/2/library/stdtypes.html#str.split)? – spectras

+0

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

您应该能够使用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)) 

,如果你想这一切在同一行,使'打印这个样子的你也可以使用打印的end参数:

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 
+0

我该做什么如果我不想打印“代码1”和“代码2”和“代码3”作为输出?我不希望它按顺序编号“Code {}:”,而是希望它在一行中打印“用户代码:”,“密码:”和“引脚代码:”。 @bloominonion – DRauch

+0

您可以使用标题创建另一个列表。请参阅编辑。 – bloominonion

+0

谢谢你的帮助! – DRauch

斯普利特得到各个琴弦。 当您打印时,将其附加到除最后一个项目之外的所有项目。

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 
+0

大多数情况下,问题中的星号不是要求,而是OP如何考虑问题的副作用。 @drauch>可以,如果提取的代码不包含无关的星号?这会使代码变得更简单,因为这个答案实际上是在拆分代码后手动添加它们。 – spectras

+0

@spectras,星号不是必需的。提取的代码不需要包含星号,只需包含两者之间的值即可。 – DRauch

+0

@Prune我忘记提及数字输入,或者你的情况in_str,实际上是一个列表。因此,输入看起来像“['1','2','3','4','5','\','6','*','7','8',' 9','10','11']“,这会导致您的代码产生:'属性错误:'列表'对象没有属性'split'' – DRauch