Как добавить х количество слов х длины в разные вложенные списки

- (void)changeScopeBarColor {
NSMutableArray<UIView*> *views = [NSMutableArray new];
NSArray<UIView *> *subviews = [_searchBar subviews];
[views addObjectsFromArray:subviews];
for (;;) {
    if (views.count == 0) {
        break;
    }

    UIView *v = [views firstObject];
    [views removeObject:v];

    if ([[[v class] description] isEqualToString:@"_UISearchBarScopeBarBackground"]) {
        v.backgroundColor = [UIColor whiteColor];
        break;
    }
    if (v.subviews.count > 0)
        [views addObjectsFromArray:v.subviews];
    }
}
1
задан Patrick Artner 15 January 2019 в 18:32
поделиться

3 ответа

Как я уже упоминал в комментарии, я использовал словарь для решения этой проблемы.

Здесь вам не нужно беспокоиться о создании пустого списка с помощью какой-либо внешней функции, так как мы не знаем фактическую длину.

Так что вы можете попробовать вот так.

Вы можете посетить https://rextester.com/ZQKA28350 , чтобы запустить код онлайн.

def add_words_to_bucket(words): 
    d = {}

    for word in words: 
        l = len(word)
        if l in d: 
            d[l].append(word) 
        else: 
            i = 0
            while l >= 0 and not l in d:
                if not i: 
                    d[l] = [word]
                else: 
                    d[l] = []
                l = l - 1
                i += 1
    return d

def get_as_list(d): 
    bucket = [d[i] for i in range(0, len(d))]
    return bucket


words = ["a",  "git", "go", "py", "java", "paper", "ruby", "r"]
d = add_words_to_bucket(words) 
bucket = get_as_list(d)
print(d) # {0: [], 1: ['a', 'r'], 2: ['go', 'py'], 3: ['git'], 4: ['java', 'ruby'], 5: ['paper']}
print(bucket) # [[], ['a', 'r'], ['go', 'py'], ['git'], ['java', 'ruby'], ['paper']]


words2 = ["a",  "git", "go", "py", "", "java", "paper", "ruby", "r","TheIpMan", ""]
d2 = add_words_to_bucket(words2)
bucket2 = get_as_list(d2)
print(d2) # {0: ['', ''], 1: ['a', 'r'], 2: ['go', 'py'], 3: ['git'], 4: ['java', 'ruby'], 5: ['paper'], 6: [], 7: [], 8: ['TheIpMan']}
print(bucket2) # [['', ''], ['a', 'r'], ['go', 'py'], ['git'], ['java', 'ruby'], ['paper'], [], [], ['TheIpMan']]
0
ответ дан hygull 15 January 2019 в 18:32
поделиться

Вы можете получить самое длинное слово в списке слов с помощью max() и снабдить ключевую функцию len.

Вы можете создать еще один блок для «пустых» слов и отсортировать все ваши слова в сегменты, используя цикл for и индексируя в свои сегменты с помощью len(word):

# create some demo strings and add some other words
words = [ str(10**k) for k in range(10)]
words.extend(["this","should","work","out","somehow"])

print(words)  # ['1', '10', '100', '1000', '10000', '100000', '1000000', '10000000',
              #  '100000000', '1000000000', 'this', 'should', 'work', 'out', 'somehow']

longest = len(max(words,key=len)) # get the length of the longest word

# create a empty bucket for "" and one bucket for length 1 up to longest
bins = [None] + [ [] for _ in range(longest+1)]  

# loop over words and put then in the bin at index len(word)
for w in words:
    bins[len(w)].append(w)

print(bins)

Вывод:

[None, ['1'], ['10'], ['100', 'out'], ['1000', 'this', 'work'], ['10000'], 
       ['100000', 'should'], ['1000000', 'somehow'], ['10000000'], 
       ['100000000'], ['1000000000']]

Доку:

0
ответ дан Patrick Artner 15 January 2019 в 18:32
поделиться

buckets = [0] * longest # this will make a list of longest size

Затем создайте список в каждом элементе, и я использую первый элемент списка, чтобы вести подсчет этого сегмента.

for i in range(longest): buckets[i] = [0]

Затем вам нужно добавить слова в ведра.

for L in words: buckets[len(L)][0] += 1 # increasing the count of that bucket buckets[len(L)].append(L) # Adding the word to that bucket

Вот пример:

longest = 10
words = ['this', 'that', 'foremost']
buckets = [0] * longest # this will make a list of longest size 
for i in range(longest):
   buckets[i] = [0]
for L in words:
   buckets[len(L)][0] += 1 # increasing the count of that bucket
   buckets[len(L)].append(L) # Adding the word to that bucket 

Чтобы получить доступ к любому из подсчетов, это просто buckets[number][0] и для доступа ко всем словам, вы цикл, начинающийся с buckets[number][1].

0
ответ дан I Funball 15 January 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: