重新格式化字符串,例如转换像
这样的作者列表"David Joyner, Ashok Goel, Nic Papin"
到
"Joyner, D., Goel, A., Papin, N."
对这个问题的去向感到困惑。我知道它很简单,只使用.split()
和.strip()
等方法,但无法弄清楚我需要什么组合。在我变成Dobby敲我的头在墙上之前请帮忙。
答案 0 :(得分:2)
这应该有效。
s = "David Joyner, Ashok Goel, Nic Papin"
names = s.split(",")
result = ""
for name in names:
first, last = name.split()
result += last + ', ' + first[0] + '., '
print(result[:-2])
稍微简单的版本是:
split
但是涉及额外的enumerate
操作,如果你有大量的名字会使它变慢(否则它将是一个可以忽略不计的变化)。
使用姓氏做一些具体的事情:
因此,如果您想对列表的最后一个元素执行特定操作,可以采用两种方式:
最pythonic将是在第一个示例中使用index == len(list) - 1
,并捕获s = "David Joyner, Ashok Goel, Nic Papin"
names = s.split(",")
result = ""
for index, name in enumerate(names):
first, last = name.split()
# Checks if index is lower than last.
if index < (len(names) - 1):
result += last + ', ' + first[0] + '., '
else:
result += '& ' + last + ", " + first[0] + '.'
print(result)
(最后一个元素)的情况:
enumerate
但是,如果您已经设置了使用s = "David Joyner, Ashok Goel, Nic Papin"
names = s.split(",")
result = ""
for name in names[:-1]:
first, last = name.split()
result += last + ', ' + first[0] + '., '
# Final element operation.
first, last = names[-1].split()
result += '& ' + last + ", " + first[0] + '.'
print(result)
,那么您可以通过仅将列表迭代到倒数第二个元素并在循环外执行最终操作来获得相同的行为:
enumerate
你真的应该使用result
,这是它的预期用例。无论您选择哪种算法,我们都会注意到我们打印的是result[:-2]
而不是 public void consolePrintResetTest(){
consolePrintReset();
assertEquals("Les statistiques ont été réinitialisées avec succès!"
+ System.lineSeparator(), OUTCONTENT.toString());
}
。这是因为我们不再像以前那样在姓氏中添加不必要的字符。
答案 1 :(得分:0)
答案 2 :(得分:0)
结帐list comprehensions,str.join和str.format。如果你使用python很多,你会发现它们都非常有用。
s = "David Joyner, Ashok Goel, Nic Papin"
fl_names = [name.split() for name in s.split(",")]
formatted_names = ["{0}, {1}.".format(last, first[0]) for first, last in fl_names]
result = ", ".join(formatted_names)
您也可以使用嵌套列表推导法将所有内容整合在一起,但正如您所看到的,这可能会更难以快速阅读。
", ".join(["{0}, {1}.".format(last, first[0])
for first, last in [name.split() for name in s.split(",")]])