Python, list has repetitive parts

2024-10-03 23:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过告诉这两个元素重复了多少次来缩短一个包含重复元素的列表。你知道吗

list1 = ["New York", "California", "Illinois", "Texas", "Illinois", "Texas", "Illinois", "Texas", "Illinois", "Texas", "Illinois", "Texas", "Indiana"]

repetitives = []

for num, element in enumerate(list1):
    if element == list1[num - 2]:
        repetitives.append(element)

core_repetitives = repetitives[0:2]

string_repetitives = ",".join(repetitives)
string_core_repetitives = ",".join(core_repetitives)

repetitives_times = string_repetitives.count(string_core_repetitives)

string_list1 = ",".join(list1)

print string_list1.replace(string_repetitives, "(" + "-".join(core_repetitives) + ") " + str(repetitives_times) + " times")

输出为:

New York,California,(Illinois-Texas) 4 times,Illinois,Texas,Indiana

很明显,它错过了一个计数。你知道吗

问题是列表“repetitives”没有从“if element==list1[num-2]:”行中得到正确的部分。你知道吗

如何正确识别“伊利诺伊州-德克萨斯州”重复5次?你知道吗

相关问题

上述问题有两个已知要素。但是如果重复部分是由未知数量的重复组成的呢?你知道吗

例如:

list2 = ["New York", "California", "Illinois", "Texas", "Indiana", "Ohio", "North Carolina", "Washington", "Illinois", "Texas", "Indiana", "Ohio", "North Carolina", "Washington", "Colorado", "Michigan"]

如何分辨[“伊利诺伊州”、“德克萨斯州”、“印第安纳州”、“俄亥俄州”、“北卡罗来纳州”、“华盛顿州”]在这里重复两次?你知道吗


Tags: core元素newstringelementnumjointimes
3条回答

这将映射您的术语及其在列表中的出现

from collections import Counter
occurrences = Counter(list1)

然后你可以根据它创建一个新的地图

sublists = {}
for k, v in occurrences.iteritems():
    sublists.setdefault(v, []).append(k)

下面是我将如何实现您的代码:

from collections import OrderedDict


def repeats(lst):
        return [el for el in lst if lst.count(el) > 1]

def shorten(lst):
    repeat_els = repeats(lst)
    new_lst = [el for el in lst if el not in repeat_els]

    repeats_str = '-'.join(repeat_els)
    core_repeats = '-'.join(list(OrderedDict.fromkeys(repeat_els)))

    repeat_times = repeats_str.count(core_repeats)
    first_repeat_index = lst.index(repeat_els[0])
    repeats_str = '({}) {}'.format(core_repeats, repeat_times)

    new_lst.insert(first_repeat_index, repeats_str)
    return ','.join(new_lst)

概述一下:上面的代码首先将重复和非重复元素分为两个单独的列表。然后将重复的元素格式化为正确的字符串格式,将格式化的字符串添加到非重复元素列表的正确位置,然后将整个非重复元素列表','.join合并在一起。你知道吗

下面是一个演示:

>>> list1 = ["New York", "California", "Illinois", 
...          "Texas", "Illinois", "Texas", "Illinois", 
...          "Texas", "Illinois", "Texas", "Illinois", 
...         "Texas", "Indiana"]
>>> 
>>> shorten(list1)
'New York,California,(Illinois-Texas) 5,Indiana'
>>> 
>>> list2 = ["New York", "California", "Illinois", 
...         "Texas", "Indiana", "Ohio", 
...         "North Carolina", "Washington", "Illinois", 
...         "Texas", "Indiana", "Ohio", 
...         "North Carolina", "Washington", "Colorado", 
...         "Michigan"]
>>> shorten(list2)
'New York,California,(Illinois-Texas-Indiana-Ohio-North Carolina-Washington) 2,Colorado,Michigan'
>>> 

我想了一个方法来操纵第一次尝试,让它看起来更好。。。你知道吗

够笨拙的,不是真正的技术。你知道吗

即使它看起来不错,但实际上它是错误的-它计数(伊利诺伊州得克萨斯州)作为额外的,无论它出现在哪里(然而,它应该只考虑何时(伊利诺伊州得克萨斯州)是一个错过了第一次尝试)。你知道吗

list1 = ["New York", "California", "Illinois", "Texas", "Illinois", "Texas", "Illinois", "Texas", "Illinois", "Texas", "Illinois", "Texas", "Indiana"]

repetitives = []

for num, element in enumerate(list1):
    if element == list1[num - 2]:
        repetitives.append(element)

core_repetitives = repetitives[0:2]

string_repetitives = ",".join(repetitives)
string_core_repetitives = ",".join(core_repetitives)

repetitives_times = string_repetitives.count(string_core_repetitives)

string_list1 = ",".join(list1)

first_try = string_list1.replace(string_repetitives, "(" + "-".join(core_repetitives) + ") " + str(repetitives_times) + " times")

extra_count = first_try.count(string_core_repetitives)

actual_times = repetitives_times + extra_count

second_try = string_list1.replace(string_repetitives, "(" + "-".join(core_repetitives) + ") " + str(actual_times) + " times")

print second_try.replace(string_core_repetitives, "").replace(",,", ",")

输出为:

New York,California,(Illinois-Texas) 5 times,Indiana

相关问题 更多 >