【问题标题】:Find consecutive strings representing numbers in a Python list [duplicate]在 Python 列表中查找表示数字的连续字符串 [重复]
【发布时间】:2020-01-16 09:21:21
【问题描述】:

我有一个这样的列表

['1133', '1300', '1418', '1443', '1473', '1600', '1601', '1988', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '2000', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2012', '2013', '2014', '2015', '2153', '2600', '3000', '3714', '3785', '3896', '3995', '4001', '4436', '5094', '5346', '8000']

如何找到包含连续数字字符串的子组(例如:'2012'、'2013'、'2014'、'2015')?

谢谢!

【问题讨论】:

  • 你能发布一些你尝试过的东西吗
  • 嗨,@smac89,我盯着列表看了一会儿,不知道从哪里开始,所以我想不出任何可能的试错测试解决方案!

标签: python string list


【解决方案1】:

这是一种方法,如果您对指定的所有元素都在同一个 result 列表中感到满意

a = ['1133', '1300', '1418', '1443', '1473', '1600', '1601', '1988', '1990', '1991', '1992', '1993', '1994', '1995',
     '1996', '1997', '1998', '2000', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2012', '2013',
     '2014', '2015', '2153', '2600', '3000', '3714', '3785', '3896', '3995', '4001', '4436', '5094', '5346', '8000']
result = []
for i, x in enumerate(a):
    previous_e = -9999 if i == 0 else int(a[i - 1])
    next_e = -9999 if i == len(a) - 1 else int(a[i + 1])
    if int(x) == previous_e + 1 or int(x) == next_e - 1:
        result.append(x)

print(result)

['1600', '1601', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '2004', '2005 '、'2006'、'2007'、'2008'、'2009'、'2010'、'2013'、'2014'、'2015']

【讨论】:

  • 感谢您的建议,Ofer。能否请您解释一下-9999 的来源和用途?
  • @Nemo -9999 只是我选择的一些随机值,它与列表中的值相去甚远,只有当没有“上一个”或“下一个”值放在那里时。我可以选择任何不接近列表值的数字,甚至是None
  • @Nemo 也添加了一个小修复,错过了一个字符
  • 不确定,因为我检查了您的代码之后 @smac89(当我的大脑已经习惯于查找连续数字的逻辑时)并且由于您对-9999的额外解释,我用更少的时间来理解和欣赏你的代码。再次感谢!
【解决方案2】:

如果您将列表转换为 int 列表。

mylist = list(map(int, mylist))

然后您可以应用写为here 的答案。但是如果你使用的是 python 3,别忘了把它转换成 python 3 的语法。

【讨论】:

  • 谢谢穆莱希。我认为对于像我这样没有编程背景的人来说,您的解决方案更容易遵循。但是,它不像 smac89 那样独立。
【解决方案3】:

试试这样的:

l = ['1133', '1300', '1418', '1443', '1473', '1600', '1601', '1988', '1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998', '2000', '2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2012', '2013', '2014', '2015', '2153', '2600', '3000', '3714', '3785', '3896', '3995', '4001', '4436', '5094', '5346', '8000']

size = len(l)
i = 0
while i < size:
   j = i
   while j + 1 < size and int(l[j]) + 1 == int(l[j + 1]):
      j += 1
   if j != i:
       print (l[i:j+1])
   i = j + 1

输出:

['1600', '1601']
['1990', '1991', '1992', '1993', '1994', '1995', '1996', '1997', '1998']
['2003', '2004', '2005', '2006', '2007', '2008', '2009', '2010']
['2012', '2013', '2014', '2015']

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2018-11-22
    • 2016-06-01
    • 2020-03-20
    相关资源
    最近更新 更多