Python - генерирует выражение понимания списка переменных на основе ввода - PullRequest
0 голосов
/ 11 февраля 2019

Новое здесь и новое в Python, поэтому будьте осторожны

Я пытаюсь определить функцию для генерации различных выражений понимания списка на основе ввода.То, что я хочу, чтобы:

ввод:

TableTop = Part(L,D,T)

генерация:

TableTop.unique = [(L,D,T) for L in lengthList for D in depthlist, for T in thickList]

или ввод:

LegPost = Part(H,T)

генерация:

LegPost.unique = [(H,T) for H in heightList for T in thickList]

РЕДАКТИРОВАТЬ

Извините, ребята, давайте попробуем это снова.

Контекст:

Я пытаюсь написать программу, которая будет включена в список деталей.(в данном случае это части кухонного стола) и список размеров (параметры для настройки размеров таблицы), а также выходные объекты сетки Blender.Эта конкретная таблица имеет 9 частей и 5 измерений

partList = (TableTop, LegPost, BaseFoot, AngleBrace, CenterAngle, TopCap, HorizontalBrace, VerticalBrace, CenterBrace)

dimList = (lengthList, depthList, heightList, thickList, ohangList)

lengthList = range(60,145)   # table length options (60"-144")
depthList = range(30,55)     # table depth options (30"-54")
heightList = range(30,45)    # table height options (30"-44")
thickList = range(3,9)       # tabletop thickness options (3/4"-2")
ohangList = range(10,23)     # table end overhang options (10"-22")

Не каждая часть таблицы затрагивается каждым измерением.Я хочу создать одну сетку Блендера для каждой уникальной части таблицы (например, # уникальных LegPosts = len(heightList) * len(thickList) = 84).Для этого я создал класс Part:

class Part:  
    def __init__(self, dims):  
        self.dims = dims
        ...

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

Где я застрял:

Я хочу определить функцию внутри класса, которая запускается при создании экземпляра, принимает кортеж (например, (L, D, T)) и генерирует понимание списка (например, [(L, D, T) для L в lengthList для D в deeplist, для T в ThickList]) где L, D, H, T и G всегда соответствуют длинамList, deepList, heightList, ThickList и ohangList соответственно.Я понятия не имею, как создать эту функцию, просто ищу небольшое направление.

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Вот почему itertools.product существует:

import itertools

L = range(60,145)   # table length options (60"-144")
D = range(30,55)     # table depth options (30"-54")
H = range(30,45)    # table height options (30"-44")
T = range(3,9)       # tabletop thickness options (3/4"-2")
O = range(10,23)     # table end overhang options (10"-22")

class Part:
    def __init__(self, dims):
        self._dims = dims

    @property
    def unique(self):
        return list(itertools.product(*self._dims))

>>> Part((T,H)).unique
[(3, 30), (3, 31), (3, 32), (3, 33), (3, 34), ..., (8, 39), (8, 40), (8, 41), (8, 42), (8, 43), (8, 44)]

Если вы хотите создать собственную реализацию, вам следует использовать рекурсивную функцию:

>>> def cprod(*dims):
...     if len(dims) == 0: return []
...     if len(dims) == 1: return list(dims[0])
...     def cprod_aux(d, *ds):
...         return [(x, *y) for x in d for y in cprod_aux(*ds)] if ds else ((x,) for x in d)
...     return cprod_aux(*dims)
>>> cprod()
[]
>>> cprod(D)
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54]
>>> cprod(L, D, H)
[(60, 30, 30), (60, 30, 31), (60, 30, 32), (60, 30, 33), (60, 30, 34), (60, 30, 35), ..., (144, 54, 39), (144, 54, 40), (144, 54, 41), (144, 54, 42), (144, 54, 43), (144, 54, 44)]

Реализация наивна (выможет использовать некоторые памятка )

0 голосов
/ 11 февраля 2019
class Part:  
    def __init__(self, *dims):  
        self.dims = *dims
        ...

После того, как self.dims распаковал *dims, можно выполнить цикл for, чтобы выполнить то, что вам нужно.Чтобы сделать то, что вам нужно, вам потребуется использовать рекурсию для генерации n-уровневых циклов for

def gen_nestedforloop(dims): #throw in self.dims here
    output = []
    if len(dims) > 1:
        gen_nestedforloop(dims[1:])
    else:
        output.append([x for x in dims])
        return output
...