打印出列表中至少有一个公共数字的相邻数字

Posted

技术标签:

【中文标题】打印出列表中至少有一个公共数字的相邻数字【英文标题】:Printing out adjacent numbers in a list that have at least one common digit between them 【发布时间】:2022-01-22 10:26:48 【问题描述】:

我有一个自然数列表,我需要打印出每两个相邻的至少有一个数字相同的整数。到目前为止,我已经写了:

for i in range(len(my_list) - 1):
    first, second = my_list[i], my_list[i+1]
    if first==second and first>0 and second>0:
        print(first, second)
    else:
        print("nothing")

但是,如您所见,它缺少整数部分。我曾考虑过除以整数并处理结果,但我确信这不会奏效。

【问题讨论】:

请显示数字和输出的示例列表 【参考方案1】:

这是一个字符串可以非常有效的地方。您可以将整数的字符串表示形式转换为集合,然后可以将其与另一个集合进行比较。如果交集不为空,则它们共享一个数字:

if set(str(first)) & set(str(second)):
    # first and second share a digit

【讨论】:

谢谢!我是个新手,听说过将整数转换为字符串!【参考方案2】:

尝试使用enumerate() 以获得更清晰的循环语义。

拥有this_nnext_n 后,将整数分解为字符串以将数字转换为字符。然后,使用set 来区分每个字符串的单个数字,并使用其intersection() 方法查看两个集合是否具有共同元素:

numbers = [1,2,3,4,5,6,7,8,9,10,11,12]

for i, this_n in enumerate(numbers[:-1]):
    next_n = numbers[i+1]
    these_chars = set(str(this_n))
    next_chars = set(str(next_n))
    if these_chars.intersection(next_chars):
        print(this_n, next_n)

当我运行它时,我得到:

10 11
11 12

【讨论】:

更好的是:for a, b in zip(numbers, numbers[1:]): 用于单行,或者itertools.tee,如果您想要更长、更高效的实现。 @MadPhysicist 嗯,应该是for a, b in zip(numbers[:-1], numbers[1:]),对吧?我仍然倾向于我的代码以提高可读性,但感谢您的分享。 :) zip 将以最短的迭代终止,因此您可以偷懒。除此之外,您的理解是完全正确的。我的评论只是那个(评论),而不是对您的回答的建议。你有我的 +1【参考方案3】:

您可以使用 zip 将项目与列表理解中的后继项目配对。然后选择两个数字的数字集之间存在交集的对。您可以使用set(str(n)) 获取数字的一组数字:

numbers = [1,234,325,987,108,999]

print([ (a,b) for a,b in zip(numbers,numbers[1:]) if set(str(a))&set(str(b)) ])

[(234, 325), (987, 108)]

【讨论】:

以上是关于打印出列表中至少有一个公共数字的相邻数字的主要内容,如果未能解决你的问题,请参考以下文章

舞蹈课(dancingLessons)

格式化double,printf中至少有一个小数

linux redhat下密码复杂度要求数字大小写字母和特殊符号4类中至少有两类怎么设置

当表达式显示时打印静态文本如果细节带中至少有一个非空字段

用java语句,1、建立一个数据库student,在数据库中建一个student表,表中至少有学号、姓名、专业三个字段

Leetcode 广搜动态规划01 矩阵(542)