如果第一个数字和长度相同,则从列表中删除数字

时间:2018-07-13 12:55:44

标签: python python-3.x list-comprehension

假设我有一个sendPasswordResetEmail的列表 我想删除所有以相同数字开头且长度相同的数字。 结果应为:[100, 210, 250, 300, 405, 430, 500, 1850, 1875, 2120, 2150]

到目前为止,我有:

[100, 210, 300, 405, 500, 1850, 2120]

我有一个for i in installed_tx_calc: if (len(str(i)) == 3) and (str(i)[:1] == str(i-1)[:1]): installed_tx_calc.remove(i) elif str(i)[:2] == str(i-1)[:2]: installed_tx_calc.remove(i) 的列表,我的代码输出为[862, 1930, 2496]

搜索时找不到任何东西,但感觉好像缺少明显的东西。

谢谢您的时间。

4 个答案:

答案 0 :(得分:5)

您可以使用itertools.groupby通过列表理解来创建新列表:

'insert into mysql (id, name, age, address) values ?'

我们使用元组(第一个数字,数字的长度)进行分组,并保留每个组的第一个数字,该数字由from itertools import groupby numbers = [100, 210, 250, 300, 405, 430, 500, 1850, 1875, 2120, 2150] out = [next(group) for key, group in groupby(numbers, key=lambda n: (str(n)[0], len(str(n))))] print(out) # [100, 210, 300, 405, 500, 1850, 2120] 获得。

答案 1 :(得分:1)

创建一个将保留唯一条目的新集合。然后,您可以根据该集合进行过滤:

unique = set()
mylist = [100, 210, 250, 300, 405, 430, 500, 1850, 1875, 2120, 2150]
newlist = []

for num in mylist:
    num_str = str(num)
    length = len(num_str)
    first_digit = num_str[0]
    if (length, first_digit) in unique:
        continue
    newlist.append(num)
    unique.add((length, first_digit))

>>> newlist
[100, 210, 300, 405, 500, 1850, 2120]

答案 2 :(得分:1)

目前,您正在将变量"yyyy-MM-dd'T'HH:mm:ss"用作i中的字符串。但是,您不能从字符串中减去。您真正想要的是使用installed_tx_calc作为索引并以这种方式访问​​:i。但是,如果要从列表中删除项目,则使用索引可能会很棘手,因此我已将for循环替换为while循环。另外,我建议您直接访问第一个数字,而不要获取一个切片。因此,您的代码将更像这样:

installed_tx_calc[i]

请记住,如果您有更多的长度不等于3或4的长度,这将会中断。更可扩展的解决方案是:

i = 1
while i < len(installed_tx_calc):
    if len(str(installed_tx_calc[i]) == 3 and str(installed_tx_calc[i])[0] == str(installed_tx_calc[i-1])[0]:
        installed_tx_calc.remove(i)
        continue
    elif str(installed_tx_calc[i])[0] == str(installed_tx_calc[i-1])[0]:
        installed_tx_calc.remove(i)
        continue
    i += 1

最后的优化是避免使用i = 1 while i < len(installed_tx_calc): if len(str(installed_tx_calc[i])) == len(str(installed_tx_calc[i-1])) and str(installed_tx_calc[i])[0] == str(installed_tx_calc[i-1])[0]: installed_tx_calc.remove(i) continue i += 1 来建立新列表。与remove相比,remove的操作可能相当慢,因此以下内容将比前两种解决方案更快:

append

答案 3 :(得分:0)

首先将列表从低值到高值排序。检查数字的最高基数(对于350,则为100),如果之前未出现该基数的倍数(即3),则将该值添加到新列表中

a_list = [210, 100, 250, 300, 405, 430, 500, 1850, 1875, 2120, 2150]
a_list.sort()
new_list = []
base = 1
pre_multiple = 0

for value in a_list:
    while (value / base ) >= 10:
        base *= 10

    multiple = int(value/base)
    if multiple != pre_multiple:
        new_list.append(value)

    pre_multiple = multiple

print(new_list)