O'chirish uchun takrorlanishni oldini olish

Ushbu ma'lumotlar strukturasi (o'zgarmaydigan hajmda) berilgan:

items =   [(u'Triathalon ', u' Teenager'), (u'The Airplanes ', u' Paper Hearts'), (u"Holy '57 ", u' Island Kids'), (u'Yohuna ', u' Apart'), (u'Moon Bounce ', u' Shake'), (u'Miami Horror ', u' Wild Motion (Set It Free)'), (u'Colleagues ', u' Somewhere'), (u'Poor Spirits ', u' BwooKlyn'), (u'Air Review ', u' Young'), (u'Radiohead', u'Karma Police')]

Men buni qilmoqchiman:

if len(items) > 10:
   for artist, track in random.sample(items, 10):
       # do a lot of things in many lines of code
elif len(items) < 10:
   for artist, track in items:
       # do the exact same thing

ammo bu juda keraksiz.

o'z-o'zidan takrorlanmasdan bitta natijaga erishishning eng oddiy yo'li nima?

1
yaxshi ta'kidlagan, uni tuzatadi.
qo'shib qo'ydi muallif data_garden, manba
Mavjud kodingiz len (items) == 10 holatlarini bartaraf etmasligini bilasizmi? Ehtimol, agar siz kodni ishlatsangiz, shartli tekshiruvsiz elif iborasi faqat else bo'lishi kerak.
qo'shib qo'ydi muallif ShadowRanger, manba

6 javoblar

Ahamiyatsiz yondashuv sample so'zsiz ishlatishdir, lekin kirish uzunligiga asoslangan holda namunaviy o'lchamni cheklash (ya'ni sample faqat kesishsiz kichik kirishlarni aralashtirib yuboradi):

for artist, track in random.sample(items, min(len(items), 10)):

Qimmatli farqlar, chunki u kichik ro'yxatlarni tasodifiy tartibda belgilaydi, ammo siz aniq buyurtma berishni xohlamadingiz.

3
qo'shib qo'ydi

Siz quyidagilarni sinashingiz mumkin:

for artist, track in random.sample(items,min(10,len(items))):
# do something
2
qo'shib qo'ydi

Maksimal qiymati o'rnatish uchun min (ha min emas, balki max ) dan foydalaning.

for artist, track in random.sample(items, min(10, len(items))):

Shu bilan bir qatorda, ilgari qiziqqan ma'lumotlaringizni saqlashingiz mumkin:

if len(items) > 10:
    i = random.sample(items, 10)
else:
    i = items
for artist, track in i:

Esingizda bo'lsa, sizning kodingiz o'zgaruvchan uzunlikdagi elementlari uchun turli xulq-atvorga ega, chunki undan uzunroq elementlar tasodifiy tanlangan bo'lib, undan qisqartirilgani esa asl tartibida qayta ishlanadi.

1
qo'shib qo'ydi

Ehtimol, numpy.random.choice bormi?

import numpy.random as npr

slice = npr.choice(items, 10, replace=False)
for artist, track in slice:
    # do whatever
0
qo'shib qo'ydi

Umumiy koddan oldin tasodifiy misolni qo'yishingiz mumkin.

items = [...]

if len(items) > 10:
    real_items = random.sample(items, 10):
else:
    real_items = items

Keyin real_items bilan nima qilayotganingizni qiling

0
qo'shib qo'ydi

Bu siz uchun ishlaydimi?

samplesize = 10 if len(items) > 10 else len(items)
sample = random.sample(items, samplesize)
for artist, track in sample:
    ....
0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming