Как я пишу это в Ruby/Python? Или, можно ли перевести мой LINQ в Ruby/Python?

Для меня с обновлением до 4.3.1 я просто обрезаю таблицу EdmMetaData или просто удаляю ее прямо.

8
задан Community 23 May 2017 в 10:27
поделиться

13 ответов

В Ruby:

a = (0..100).entries.sort_by {rand}.slice! 0, 5

Обновление: Вот немного отличающийся путь: = (0... 100) .entries.sort_by {рэнд} [0... 5]

Править:

и В Ruby 1.9 можно сделать это:

Array(0..100).sample(5) 
5
ответ дан 5 December 2019 в 06:11
поделиться

Вот другая версия Python, более тесно соответствуя структуре Вашего кода C#. Нет встроенного для предоставления отличных результатов, таким образом, я добавил функцию, чтобы сделать это.

import itertools, random

def distinct(seq):
    seen=set()
    for item in seq:
        if item not in seen:
            seen.add(item)
            yield item

def getRandomNumbers(max):
    while 1:
        yield random.randint(0,max)

for item in itertools.islice(distinct(getRandomNumbers(100)), 5):
    print item
0
ответ дан 5 December 2019 в 06:11
поделиться

Я не могу действительно считать Ваш LINQ, но я думаю, что Вы пытаетесь получить 5 случайных чисел до 100 и затем удалить дубликаты.

Вот решение для этого:

def random(max)
    (rand * max).to_i
end

# Get 5 random numbers between 0 and 100
a = (1..5).inject([]){|acc,i| acc << random( 100)}
# Remove Duplicates
a = a & a

Но возможно Вы на самом деле ищете 5 отличных случайных чисел между 0 и 100. В этом случае:

def random(max)
    (rand * max).to_i
end

a = []
while( a.size < 5)
    a << random( 100)
    a = a & a
end

Теперь, этот мог бы нарушить Ваш смысл "не слишком много циклов", но по-видимому Взять, и Отличный просто скрывают цикличное выполнение от Вас. Было бы достаточно легко просто добавить методы к Счетному для сокрытия цикла с условием продолжения.

-1
ответ дан 5 December 2019 в 06:11
поделиться

Возможно, это удовлетворит Вашим потребностям и посмотрит немного больше linqish:

from numpy import random,unique

def GetRandomNumbers(total=5):
    while True:
        yield unique(random.random(total*2))[:total]

randomGenerator = GetRandomNumbers()

myRandomNumbers = randomGenerator.next()
0
ответ дан 5 December 2019 в 06:11
поделиться

Вот транслитерация от Вашего решения до Python.

Во-первых, генератор, который создает Случайные числа. Это не очень Pythonic, но это - хорошее соответствие с Вашим примером кода.

>>> import random
>>> def getRandomNumbers( max ):
...     while True:
...             yield random.randrange(0,max)

Вот клиентский цикл, который собирает ряд 5 отличных значений. Это - снова - не большая часть реализации Pythonic.

>>> distinctSet= set()
>>> for r in getRandomNumbers( 100 ):
...     distinctSet.add( r )
...     if len(distinctSet) == 5: 
...             break
... 
>>> distinctSet
set([81, 66, 28, 53, 46])

Не ясно, почему Вы хотите использовать генератор для случайных чисел - это - одна из нескольких вещей, это так просто, что генератор не упрощает его.

Больше версии Pythonic могло бы быть чем-то как:

distinctSet= set()
while len(distinctSet) != 5:
    distinctSet.add( random.randrange(0,100) )

Если требования должны генерировать 5 значений и найти отличными среди тех 5, то что-то как

distinctSet= set( [random.randrange(0,100) for i in range(5) ] )
0
ответ дан 5 December 2019 в 06:11
поделиться

Ну, сначала Вы переписываете LINQ в Python. Затем Вашим решением является острота :)

from random import randrange

def Distinct(items):
    set = {}
    for i in items:
        if not set.has_key(i):
            yield i
            set[i] = 1

def Take(num, items):
    for i in items:
        if num > 0:
            yield i
            num = num - 1
        else:
            break

def ToArray(items):
    return [i for i in items]

def GetRandomNumbers(max):
    while 1:
        yield randrange(max)

print ToArray(Take(5, Distinct(GetRandomNumbers(100))))

При помещении всех простых методов выше в модуль под названием LINQ.py можно произвести друзей впечатление.

(Правовая оговорка: конечно, это на самом деле не переписывает LINQ в Python. У людей есть неправильное представление, что LINQ является просто набором тривиальных дополнительных методов и некоторого нового синтаксиса. Действительно усовершенствованная часть LINQ, однако, является автоматическим поколением SQL так, чтобы при запросах базы данных это была база данных, которая реализует Отличный (), а не сторона клиента.)

0
ответ дан 5 December 2019 в 06:11
поделиться
import random

def makeRand(n):
   rand = random.Random()
   while 1:
      yield rand.randint(0,n)
   yield rand.randint(0,n)      

gen = makeRand(100)      
terms = [ gen.next() for n in range(5) ]

print "raw list"
print terms
print "de-duped list"
print list(set(terms))

# produces output similar to this
#
# raw list
# [22, 11, 35, 55, 1]
# de-duped list
# [35, 11, 1, 22, 55]
0
ответ дан 5 December 2019 в 06:11
поделиться

Python с числовым Python:

from numpy import *
a = random.random_integers(0, 100, 5)
b = unique(a)

Voilà! Уверенный Вы могли сделать что-то подобное в стиле функционального программирования, но... почему?

0
ответ дан 5 December 2019 в 06:11
поделиться

Вот другое решение Ruby:

a = (1..5).collect { rand(100) }
a & a

Я думаю с Вашим оператором LINQ, Отличное удалит дубликаты после того, как 5 были уже взяты, таким образом, Вы, как гарантируют, не вернетесь 5. Кто-то может исправить меня, если я неправ, все же.

2
ответ дан 5 December 2019 в 06:11
поделиться

РЕДАКТИРОВАНИЕ: хорошо, только для забавы, более короткого и более быстрого одно (и все еще использование итераторов).

def getRandomNumbers(max, size) :
    pool = set()
    return ((lambda x :  pool.add(x) or x)(random.randrange(max)) for x in xrange(size) if len(a) < size)

print [x for x in gen(100, 5)]
[0, 10, 19, 51, 18]

Да, я знаю, остроты нужно оставить любителям жемчуга, но я думаю, что этот довольно мощен не так ли?

Старое сообщение здесь:

Мой бог, насколько сложный все это! Давайте будем pythonic:

import random
def getRandomNumber(max, size, min=0) :
   # using () and xrange = using iterators
   return (random.randrange(min, max) for x in xrange(size))

print set(getRandomNumber(100, 5)) # set() removes duplicates
set([88, 99, 29, 70, 23])

Приятного отдыха

РЕДАКТИРОВАНИЕ: Как комментаторы заметили, это - точный перевод кода вопроса.

Для предотвращения проблемы, мы добрались путем удаления дубликатов после генерации списка, приводящего к слишком небольшим данным, можно выбрать иначе:

def getRandomNumbers(max, size) :
    pool = []
    while len(pool) < size :
        tmp = random.randrange(max)
        if tmp not in pool :
            yield pool.append(tmp) or tmp

print [x for x in getRandomNumbers(5, 5)]
[2, 1, 0, 3, 4]
2
ответ дан 5 December 2019 в 06:11
поделиться

Я воздержусь от простых решений с помощью 'случайного' модуля, так как я беру его, это не действительно, что Вы после. Вот то, что я думаю, что Вы ищете в Python:

>>> import random
>>> 
>>> def getUniqueRandomNumbers(num, highest):
...     seen = set()
...     while len(seen) < num:
...         i = random.randrange(0, highest)
...         if i not in seen:
...             seen.add(i)  
...             yield i
... 
>>>

Чтобы показать Вам, как это работает:

>>> list(getUniqueRandomNumbers(10, 100))
[81, 57, 98, 47, 93, 31, 29, 24, 97, 10]
2
ответ дан 5 December 2019 в 06:11
поделиться

Хм... Как насчет (Python):

s = set()
while len(s) <= N: s.update((random.random(),))
3
ответ дан 5 December 2019 в 06:11
поделиться
>>> import random
>>> print random.sample(xrange(100), 5)
[61, 54, 91, 72, 85]

Это должно привести к 5 уникальным значениям в диапазоне 0 — 99. xrange объект генерирует значения согласно просьбе, таким образом, никакая память не используется для значений, которые не выбираются.

13
ответ дан 5 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

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